@makebelieve21213-packages/nest-common 1.0.0 → 1.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.
- package/README.md +150 -0
- package/dist/errors/__tests__/json-rpc.error.spec.d.ts +2 -0
- package/dist/errors/__tests__/json-rpc.error.spec.d.ts.map +1 -0
- package/dist/errors/__tests__/json-rpc.error.spec.js +175 -0
- package/dist/errors/__tests__/json-rpc.error.spec.js.map +1 -0
- package/dist/errors/json-rpc.error.d.ts +13 -0
- package/dist/errors/json-rpc.error.d.ts.map +1 -0
- package/dist/errors/json-rpc.error.js +78 -0
- package/dist/errors/json-rpc.error.js.map +1 -0
- package/dist/filters/__tests__/json-rpc-exception.filter.spec.d.ts +2 -0
- package/dist/filters/__tests__/json-rpc-exception.filter.spec.d.ts.map +1 -0
- package/dist/filters/__tests__/json-rpc-exception.filter.spec.js +208 -0
- package/dist/filters/__tests__/json-rpc-exception.filter.spec.js.map +1 -0
- package/dist/filters/json-rpc-exception.filter.d.ts +8 -0
- package/dist/filters/json-rpc-exception.filter.d.ts.map +1 -0
- package/dist/filters/json-rpc-exception.filter.js +114 -0
- package/dist/filters/json-rpc-exception.filter.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/pipes/__tests__/json-rpc-validation.pipe.spec.d.ts +2 -0
- package/dist/pipes/__tests__/json-rpc-validation.pipe.spec.d.ts.map +1 -0
- package/dist/pipes/__tests__/json-rpc-validation.pipe.spec.js +346 -0
- package/dist/pipes/__tests__/json-rpc-validation.pipe.spec.js.map +1 -0
- package/dist/pipes/json-rpc-validation.pipe.d.ts +6 -0
- package/dist/pipes/json-rpc-validation.pipe.d.ts.map +1 -0
- package/dist/pipes/json-rpc-validation.pipe.js +89 -0
- package/dist/pipes/json-rpc-validation.pipe.js.map +1 -0
- package/dist/types/json-rpc-error-codes.d.ts +20 -0
- package/dist/types/json-rpc-error-codes.d.ts.map +1 -0
- package/dist/types/json-rpc-error-codes.js +99 -0
- package/dist/types/json-rpc-error-codes.js.map +1 -0
- package/dist/types/json-rpc-types.d.ts +17 -0
- package/dist/types/json-rpc-types.d.ts.map +1 -0
- package/dist/types/json-rpc-types.js +2 -0
- package/dist/types/json-rpc-types.js.map +1 -0
- package/package.json +6 -6
package/README.md
CHANGED
|
@@ -261,6 +261,53 @@ async publish(userId: string, event: SOCKET_EVENTS, payload: unknown) {
|
|
|
261
261
|
}
|
|
262
262
|
```
|
|
263
263
|
|
|
264
|
+
### JsonRpcException
|
|
265
|
+
|
|
266
|
+
Класс исключений для JSON-RPC 2.0 протокола. Используется для обработки ошибок в формате JSON-RPC.
|
|
267
|
+
|
|
268
|
+
**Расположение:** `src/errors/json-rpc.error.ts`
|
|
269
|
+
|
|
270
|
+
**Наследование:** `HttpException` (NestJS) - для совместимости с NestJS фильтрами
|
|
271
|
+
|
|
272
|
+
**Особенности:**
|
|
273
|
+
- Поддерживает стандартные коды ошибок JSON-RPC 2.0
|
|
274
|
+
- Автоматически маппит HTTP статусы на JSON-RPC коды ошибок
|
|
275
|
+
- Поддерживает дополнительные данные в поле `data`
|
|
276
|
+
- Может быть создан из `HttpException` или обычной `Error`
|
|
277
|
+
- Возвращает ответ в формате JSON-RPC 2.0
|
|
278
|
+
|
|
279
|
+
**Пример использования:**
|
|
280
|
+
|
|
281
|
+
```typescript
|
|
282
|
+
import { JsonRpcException, JsonRpcErrorCode } from "@packages/nest-common";
|
|
283
|
+
|
|
284
|
+
// Создание исключения с кодом ошибки
|
|
285
|
+
throw new JsonRpcException(
|
|
286
|
+
JsonRpcErrorCode.INVALID_REQUEST,
|
|
287
|
+
"Invalid request parameters",
|
|
288
|
+
{ requestId: "123", details: "Missing required field" },
|
|
289
|
+
);
|
|
290
|
+
|
|
291
|
+
// Создание из HttpException
|
|
292
|
+
const httpException = new HttpException("Not found", HttpStatus.NOT_FOUND);
|
|
293
|
+
const rpcException = JsonRpcException.fromHttpException(httpException, "request-id");
|
|
294
|
+
|
|
295
|
+
// Создание из обычной Error
|
|
296
|
+
const error = new Error("Something went wrong");
|
|
297
|
+
const rpcException = JsonRpcException.fromError(error, "request-id");
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
**Коды ошибок JSON-RPC 2.0:**
|
|
301
|
+
- `PARSE_ERROR` (-32700) - Ошибка парсинга JSON
|
|
302
|
+
- `INVALID_REQUEST` (-32600) - Невалидный запрос
|
|
303
|
+
- `METHOD_NOT_FOUND` (-32601) - Метод не найден
|
|
304
|
+
- `INVALID_PARAMS` (-32602) - Невалидные параметры
|
|
305
|
+
- `INTERNAL_ERROR` (-32603) - Внутренняя ошибка сервера
|
|
306
|
+
- `UNAUTHORIZED` (-32001) - Неавторизованный доступ
|
|
307
|
+
- `FORBIDDEN` (-32002) - Доступ запрещен
|
|
308
|
+
- `NOT_FOUND` (-32003) - Ресурс не найден
|
|
309
|
+
- И другие кастомные коды (-32004 до -32099)
|
|
310
|
+
|
|
264
311
|
---
|
|
265
312
|
|
|
266
313
|
## 🛡️ Глобальные фильтры
|
|
@@ -271,6 +318,70 @@ async publish(userId: string, event: SOCKET_EVENTS, payload: unknown) {
|
|
|
271
318
|
|
|
272
319
|
**Расположение:** `src/filters/unified-exception.filter.ts`
|
|
273
320
|
|
|
321
|
+
### JsonRpcExceptionFilter
|
|
322
|
+
|
|
323
|
+
Фильтр исключений для обработки ошибок в формате JSON-RPC 2.0. Преобразует все исключения NestJS в формат JSON-RPC 2.0.
|
|
324
|
+
|
|
325
|
+
**Расположение:** `src/filters/json-rpc-exception.filter.ts`
|
|
326
|
+
|
|
327
|
+
**Особенности:**
|
|
328
|
+
- Автоматически извлекает `requestId` из тела запроса
|
|
329
|
+
- Преобразует `JsonRpcException` в JSON-RPC формат ответа
|
|
330
|
+
- Преобразует обычные `Error` в JSON-RPC формат с автоматическим определением статуса
|
|
331
|
+
- Обрабатывает неизвестные типы исключений
|
|
332
|
+
- Логирует все ошибки с контекстом
|
|
333
|
+
|
|
334
|
+
**Использование:**
|
|
335
|
+
|
|
336
|
+
```typescript
|
|
337
|
+
import { Controller, Post, Body, UseFilters } from "@nestjs/common";
|
|
338
|
+
import { JsonRpcExceptionFilter, JsonRpcValidationPipe } from "@packages/nest-common";
|
|
339
|
+
import type { JsonRpcRequest } from "@packages/nest-common";
|
|
340
|
+
|
|
341
|
+
@Controller("mcp")
|
|
342
|
+
@UseFilters(JsonRpcExceptionFilter)
|
|
343
|
+
export default class McpController extends BaseController {
|
|
344
|
+
constructor(private readonly logger: LoggerService) {
|
|
345
|
+
super();
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
@Post()
|
|
349
|
+
async handleJsonRpcRequest(
|
|
350
|
+
@Body(JsonRpcValidationPipe) request: JsonRpcRequest,
|
|
351
|
+
) {
|
|
352
|
+
// Обработка запроса
|
|
353
|
+
if (request.method === "test.method") {
|
|
354
|
+
return {
|
|
355
|
+
jsonrpc: "2.0",
|
|
356
|
+
id: request.id,
|
|
357
|
+
result: { success: true },
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
throw new JsonRpcException(
|
|
362
|
+
JsonRpcErrorCode.METHOD_NOT_FOUND,
|
|
363
|
+
`Method ${request.method} not found`,
|
|
364
|
+
);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
**Регистрация глобально:**
|
|
370
|
+
|
|
371
|
+
```typescript
|
|
372
|
+
// В main.ts
|
|
373
|
+
import { JsonRpcExceptionFilter } from "@packages/nest-common";
|
|
374
|
+
|
|
375
|
+
async function bootstrap() {
|
|
376
|
+
const app = await NestFactory.create(AppModule);
|
|
377
|
+
const logger = await connectLogger(app, "ServiceName");
|
|
378
|
+
|
|
379
|
+
app.useGlobalFilters(new JsonRpcExceptionFilter(logger));
|
|
380
|
+
|
|
381
|
+
await app.listen(PORT);
|
|
382
|
+
}
|
|
383
|
+
```
|
|
384
|
+
|
|
274
385
|
**Регистрация:**
|
|
275
386
|
|
|
276
387
|
```typescript
|
|
@@ -617,6 +728,45 @@ export default class ApiController extends BaseController {
|
|
|
617
728
|
}
|
|
618
729
|
```
|
|
619
730
|
|
|
731
|
+
### JsonRpcValidationPipe
|
|
732
|
+
|
|
733
|
+
Валидация JSON-RPC 2.0 запросов согласно спецификации протокола.
|
|
734
|
+
|
|
735
|
+
**Расположение:** `src/pipes/json-rpc-validation.pipe.ts`
|
|
736
|
+
|
|
737
|
+
**Особенности:**
|
|
738
|
+
- Проверяет структуру запроса согласно спецификации JSON-RPC 2.0
|
|
739
|
+
- Валидирует версию протокола (`jsonrpc: "2.0"`)
|
|
740
|
+
- Проверяет наличие и тип поля `method` (должно быть строкой)
|
|
741
|
+
- Валидирует тип поля `id` (должно быть string, number или null)
|
|
742
|
+
- Валидирует тип поля `params` (должно быть object или undefined)
|
|
743
|
+
- Игнорирует объекты с NestJS метаданными (constructorRef, handler, contextType)
|
|
744
|
+
- Выбрасывает `JsonRpcException` при ошибках валидации
|
|
745
|
+
|
|
746
|
+
**Использование:**
|
|
747
|
+
|
|
748
|
+
```typescript
|
|
749
|
+
import { Controller, Post, Body } from "@nestjs/common";
|
|
750
|
+
import { JsonRpcValidationPipe, JsonRpcExceptionFilter } from "@packages/nest-common";
|
|
751
|
+
import type { JsonRpcRequest } from "@packages/nest-common";
|
|
752
|
+
|
|
753
|
+
@Controller("mcp")
|
|
754
|
+
@UseFilters(JsonRpcExceptionFilter)
|
|
755
|
+
export default class McpController extends BaseController {
|
|
756
|
+
@Post()
|
|
757
|
+
async handleJsonRpcRequest(
|
|
758
|
+
@Body(JsonRpcValidationPipe) request: JsonRpcRequest,
|
|
759
|
+
) {
|
|
760
|
+
// Обработка JSON-RPC запроса
|
|
761
|
+
return {
|
|
762
|
+
jsonrpc: "2.0",
|
|
763
|
+
id: request.id,
|
|
764
|
+
result: { /* результат */ },
|
|
765
|
+
};
|
|
766
|
+
}
|
|
767
|
+
}
|
|
768
|
+
```
|
|
769
|
+
|
|
620
770
|
---
|
|
621
771
|
|
|
622
772
|
## 🔍 Перехватчики (дополнительные)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-rpc.error.spec.d.ts","sourceRoot":"","sources":["../../../src/errors/__tests__/json-rpc.error.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { describe, it, expect } from "@jest/globals";
|
|
2
|
+
import { HttpException, HttpStatus } from "@nestjs/common";
|
|
3
|
+
import JsonRpcException from "../../errors/json-rpc.error.js";
|
|
4
|
+
import { JsonRpcErrorCode, JSON_RPC_ERROR_MESSAGES } from "../../types/json-rpc-error-codes.js";
|
|
5
|
+
describe("JsonRpcException", () => {
|
|
6
|
+
describe("constructor", () => {
|
|
7
|
+
it("должен создать исключение с кодом ошибки и сообщением по умолчанию", () => {
|
|
8
|
+
const exception = new JsonRpcException(JsonRpcErrorCode.INTERNAL_ERROR);
|
|
9
|
+
expect(exception).toBeInstanceOf(HttpException);
|
|
10
|
+
expect(exception.getRpcErrorCode()).toBe(JsonRpcErrorCode.INTERNAL_ERROR);
|
|
11
|
+
expect(exception.getStatus()).toBe(HttpStatus.INTERNAL_SERVER_ERROR);
|
|
12
|
+
const response = exception.getResponse();
|
|
13
|
+
expect(response).toEqual({
|
|
14
|
+
jsonrpc: "2.0",
|
|
15
|
+
error: {
|
|
16
|
+
code: JsonRpcErrorCode.INTERNAL_ERROR,
|
|
17
|
+
message: JSON_RPC_ERROR_MESSAGES[JsonRpcErrorCode.INTERNAL_ERROR],
|
|
18
|
+
},
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
it("должен создать исключение с кастомным сообщением", () => {
|
|
22
|
+
const customMessage = "Custom error message";
|
|
23
|
+
const exception = new JsonRpcException(JsonRpcErrorCode.INVALID_REQUEST, customMessage);
|
|
24
|
+
expect(exception.getRpcErrorCode()).toBe(JsonRpcErrorCode.INVALID_REQUEST);
|
|
25
|
+
const response = exception.getResponse();
|
|
26
|
+
expect(response).toEqual({
|
|
27
|
+
jsonrpc: "2.0",
|
|
28
|
+
error: {
|
|
29
|
+
code: JsonRpcErrorCode.INVALID_REQUEST,
|
|
30
|
+
message: customMessage,
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
it("должен создать исключение с данными", () => {
|
|
35
|
+
const data = { requestId: "123", details: "Some details" };
|
|
36
|
+
const exception = new JsonRpcException(JsonRpcErrorCode.INVALID_PARAMS, "Invalid params", data);
|
|
37
|
+
expect(exception.getRpcData()).toEqual(data);
|
|
38
|
+
const response = exception.getResponse();
|
|
39
|
+
expect(response).toEqual({
|
|
40
|
+
jsonrpc: "2.0",
|
|
41
|
+
error: {
|
|
42
|
+
code: JsonRpcErrorCode.INVALID_PARAMS,
|
|
43
|
+
message: "Invalid params",
|
|
44
|
+
data,
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
it("должен создать исключение с кастомным HTTP статусом", () => {
|
|
49
|
+
const exception = new JsonRpcException(JsonRpcErrorCode.INTERNAL_ERROR, "Error", undefined, HttpStatus.BAD_REQUEST);
|
|
50
|
+
expect(exception.getStatus()).toBe(HttpStatus.BAD_REQUEST);
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
describe("getRpcErrorCode", () => {
|
|
54
|
+
it("должен вернуть код ошибки JSON-RPC", () => {
|
|
55
|
+
const exception = new JsonRpcException(JsonRpcErrorCode.PARSE_ERROR);
|
|
56
|
+
expect(exception.getRpcErrorCode()).toBe(JsonRpcErrorCode.PARSE_ERROR);
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
describe("getRpcData", () => {
|
|
60
|
+
it("должен вернуть данные ошибки", () => {
|
|
61
|
+
const data = { key: "value" };
|
|
62
|
+
const exception = new JsonRpcException(JsonRpcErrorCode.INTERNAL_ERROR, "Error", data);
|
|
63
|
+
expect(exception.getRpcData()).toEqual(data);
|
|
64
|
+
});
|
|
65
|
+
it("должен вернуть undefined если данные не были переданы", () => {
|
|
66
|
+
const exception = new JsonRpcException(JsonRpcErrorCode.INTERNAL_ERROR);
|
|
67
|
+
expect(exception.getRpcData()).toBeUndefined();
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
describe("fromHttpException", () => {
|
|
71
|
+
it("должен создать JsonRpcException из HttpException со строковым ответом", () => {
|
|
72
|
+
const httpException = new HttpException("Error message", HttpStatus.BAD_REQUEST);
|
|
73
|
+
const rpcException = JsonRpcException.fromHttpException(httpException, "123");
|
|
74
|
+
expect(rpcException).toBeInstanceOf(JsonRpcException);
|
|
75
|
+
expect(rpcException.getStatus()).toBe(HttpStatus.BAD_REQUEST);
|
|
76
|
+
expect(rpcException.getRpcData()).toEqual({ requestId: "123" });
|
|
77
|
+
});
|
|
78
|
+
it("должен создать JsonRpcException из HttpException с объектным ответом", () => {
|
|
79
|
+
const httpException = new HttpException({ message: "Error message" }, HttpStatus.NOT_FOUND);
|
|
80
|
+
const rpcException = JsonRpcException.fromHttpException(httpException, 456);
|
|
81
|
+
expect(rpcException).toBeInstanceOf(JsonRpcException);
|
|
82
|
+
expect(rpcException.getStatus()).toBe(HttpStatus.NOT_FOUND);
|
|
83
|
+
expect(rpcException.getRpcData()).toEqual({ requestId: 456 });
|
|
84
|
+
});
|
|
85
|
+
it("должен использовать message из exception если response не содержит message", () => {
|
|
86
|
+
const httpException = new HttpException({ error: "Error" }, HttpStatus.INTERNAL_SERVER_ERROR);
|
|
87
|
+
httpException.message = "Exception message";
|
|
88
|
+
const rpcException = JsonRpcException.fromHttpException(httpException);
|
|
89
|
+
const response = rpcException.getResponse();
|
|
90
|
+
expect(typeof response === "object" &&
|
|
91
|
+
response !== null &&
|
|
92
|
+
"error" in response &&
|
|
93
|
+
typeof response.error === "object" &&
|
|
94
|
+
response.error !== null &&
|
|
95
|
+
"message" in response.error
|
|
96
|
+
? response.error.message
|
|
97
|
+
: "").toBe("Exception message");
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
describe("fromError", () => {
|
|
101
|
+
it("должен создать JsonRpcException из обычной Error", () => {
|
|
102
|
+
const error = new Error("Something went wrong");
|
|
103
|
+
const rpcException = JsonRpcException.fromError(error, "789");
|
|
104
|
+
expect(rpcException).toBeInstanceOf(JsonRpcException);
|
|
105
|
+
expect(rpcException.getRpcErrorCode()).toBe(JsonRpcErrorCode.INTERNAL_ERROR);
|
|
106
|
+
expect(rpcException.getRpcData()).toEqual({
|
|
107
|
+
requestId: "789",
|
|
108
|
+
name: "Error",
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
it("должен использовать null как requestId по умолчанию", () => {
|
|
112
|
+
const error = new Error("Error");
|
|
113
|
+
const rpcException = JsonRpcException.fromError(error);
|
|
114
|
+
expect(rpcException.getRpcData()).toEqual({
|
|
115
|
+
requestId: null,
|
|
116
|
+
name: "Error",
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
describe("HTTP статусы для различных кодов ошибок", () => {
|
|
121
|
+
it("должен вернуть BAD_REQUEST для PARSE_ERROR", () => {
|
|
122
|
+
const exception = new JsonRpcException(JsonRpcErrorCode.PARSE_ERROR);
|
|
123
|
+
expect(exception.getStatus()).toBe(HttpStatus.BAD_REQUEST);
|
|
124
|
+
});
|
|
125
|
+
it("должен вернуть BAD_REQUEST для INVALID_REQUEST", () => {
|
|
126
|
+
const exception = new JsonRpcException(JsonRpcErrorCode.INVALID_REQUEST);
|
|
127
|
+
expect(exception.getStatus()).toBe(HttpStatus.BAD_REQUEST);
|
|
128
|
+
});
|
|
129
|
+
it("должен вернуть BAD_REQUEST для INVALID_PARAMS", () => {
|
|
130
|
+
const exception = new JsonRpcException(JsonRpcErrorCode.INVALID_PARAMS);
|
|
131
|
+
expect(exception.getStatus()).toBe(HttpStatus.BAD_REQUEST);
|
|
132
|
+
});
|
|
133
|
+
it("должен вернуть UNAUTHORIZED для UNAUTHORIZED", () => {
|
|
134
|
+
const exception = new JsonRpcException(JsonRpcErrorCode.UNAUTHORIZED);
|
|
135
|
+
expect(exception.getStatus()).toBe(HttpStatus.UNAUTHORIZED);
|
|
136
|
+
});
|
|
137
|
+
it("должен вернуть FORBIDDEN для FORBIDDEN", () => {
|
|
138
|
+
const exception = new JsonRpcException(JsonRpcErrorCode.FORBIDDEN);
|
|
139
|
+
expect(exception.getStatus()).toBe(HttpStatus.FORBIDDEN);
|
|
140
|
+
});
|
|
141
|
+
it("должен вернуть NOT_FOUND для NOT_FOUND", () => {
|
|
142
|
+
const exception = new JsonRpcException(JsonRpcErrorCode.NOT_FOUND);
|
|
143
|
+
expect(exception.getStatus()).toBe(HttpStatus.NOT_FOUND);
|
|
144
|
+
});
|
|
145
|
+
it("должен вернуть NOT_FOUND для METHOD_NOT_FOUND", () => {
|
|
146
|
+
const exception = new JsonRpcException(JsonRpcErrorCode.METHOD_NOT_FOUND);
|
|
147
|
+
expect(exception.getStatus()).toBe(HttpStatus.NOT_FOUND);
|
|
148
|
+
});
|
|
149
|
+
it("должен вернуть TOO_MANY_REQUESTS для TOO_MANY_REQUESTS", () => {
|
|
150
|
+
const exception = new JsonRpcException(JsonRpcErrorCode.TOO_MANY_REQUESTS);
|
|
151
|
+
expect(exception.getStatus()).toBe(HttpStatus.TOO_MANY_REQUESTS);
|
|
152
|
+
});
|
|
153
|
+
it("должен вернуть BAD_GATEWAY для BAD_GATEWAY", () => {
|
|
154
|
+
const exception = new JsonRpcException(JsonRpcErrorCode.BAD_GATEWAY);
|
|
155
|
+
expect(exception.getStatus()).toBe(HttpStatus.BAD_GATEWAY);
|
|
156
|
+
});
|
|
157
|
+
it("должен вернуть SERVICE_UNAVAILABLE для SERVICE_UNAVAILABLE", () => {
|
|
158
|
+
const exception = new JsonRpcException(JsonRpcErrorCode.SERVICE_UNAVAILABLE);
|
|
159
|
+
expect(exception.getStatus()).toBe(HttpStatus.SERVICE_UNAVAILABLE);
|
|
160
|
+
});
|
|
161
|
+
it("должен вернуть GATEWAY_TIMEOUT для GATEWAY_TIMEOUT", () => {
|
|
162
|
+
const exception = new JsonRpcException(JsonRpcErrorCode.GATEWAY_TIMEOUT);
|
|
163
|
+
expect(exception.getStatus()).toBe(HttpStatus.GATEWAY_TIMEOUT);
|
|
164
|
+
});
|
|
165
|
+
it("должен вернуть INTERNAL_SERVER_ERROR для INTERNAL_ERROR", () => {
|
|
166
|
+
const exception = new JsonRpcException(JsonRpcErrorCode.INTERNAL_ERROR);
|
|
167
|
+
expect(exception.getStatus()).toBe(HttpStatus.INTERNAL_SERVER_ERROR);
|
|
168
|
+
});
|
|
169
|
+
it("должен вернуть INTERNAL_SERVER_ERROR для SERVER_ERROR", () => {
|
|
170
|
+
const exception = new JsonRpcException(JsonRpcErrorCode.SERVER_ERROR);
|
|
171
|
+
expect(exception.getStatus()).toBe(HttpStatus.INTERNAL_SERVER_ERROR);
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
//# sourceMappingURL=json-rpc.error.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-rpc.error.spec.js","sourceRoot":"","sources":["../../../src/errors/__tests__/json-rpc.error.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { HttpException, HttpStatus } from "@nestjs/common";
|
|
2
|
+
import { JsonRpcErrorCode } from "../types/json-rpc-error-codes.js";
|
|
3
|
+
export default class JsonRpcException extends HttpException {
|
|
4
|
+
private readonly rpcErrorCode;
|
|
5
|
+
private readonly rpcData?;
|
|
6
|
+
constructor(rpcErrorCode: JsonRpcErrorCode, message?: string, data?: unknown, httpStatus?: HttpStatus);
|
|
7
|
+
getRpcErrorCode(): JsonRpcErrorCode;
|
|
8
|
+
getRpcData(): unknown;
|
|
9
|
+
static fromHttpException(exception: HttpException, requestId?: number | string | null): JsonRpcException;
|
|
10
|
+
static fromError(error: Error, requestId?: number | string | null): JsonRpcException;
|
|
11
|
+
private static getHttpStatus;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=json-rpc.error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-rpc.error.d.ts","sourceRoot":"","sources":["../../src/errors/json-rpc.error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EACN,gBAAgB,EAGhB,MAAM,gCAAgC,CAAC;AAIxC,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,aAAa;IAC1D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAmB;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAU;gBAGlC,YAAY,EAAE,gBAAgB,EAC9B,OAAO,CAAC,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,OAAO,EACd,UAAU,CAAC,EAAE,UAAU;IAsBxB,eAAe,IAAI,gBAAgB;IAKnC,UAAU,IAAI,OAAO;IAKrB,MAAM,CAAC,iBAAiB,CACvB,SAAS,EAAE,aAAa,EACxB,SAAS,GAAE,MAAM,GAAG,MAAM,GAAG,IAAW,GACtC,gBAAgB;IAgBnB,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,GAAE,MAAM,GAAG,MAAM,GAAG,IAAW,GAAG,gBAAgB;IAQ1F,OAAO,CAAC,MAAM,CAAC,aAAa;CA2B5B"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { HttpException, HttpStatus } from "@nestjs/common";
|
|
2
|
+
import { JsonRpcErrorCode, JSON_RPC_ERROR_MESSAGES, mapHttpStatusToJsonRpcErrorCode, } from "../types/json-rpc-error-codes.js";
|
|
3
|
+
// Кастомное исключение для JSON-RPC 2.0 протокола
|
|
4
|
+
// Наследуется от HttpException для совместимости с NestJS фильтрами
|
|
5
|
+
export default class JsonRpcException extends HttpException {
|
|
6
|
+
rpcErrorCode;
|
|
7
|
+
rpcData;
|
|
8
|
+
constructor(rpcErrorCode, message, data, httpStatus) {
|
|
9
|
+
const rpcMessage = message || JSON_RPC_ERROR_MESSAGES[rpcErrorCode];
|
|
10
|
+
const status = httpStatus || JsonRpcException.getHttpStatus(rpcErrorCode);
|
|
11
|
+
super({
|
|
12
|
+
jsonrpc: "2.0",
|
|
13
|
+
error: {
|
|
14
|
+
code: rpcErrorCode,
|
|
15
|
+
message: rpcMessage,
|
|
16
|
+
...(data !== undefined && { data }),
|
|
17
|
+
},
|
|
18
|
+
}, status);
|
|
19
|
+
this.rpcErrorCode = rpcErrorCode;
|
|
20
|
+
this.rpcData = data;
|
|
21
|
+
}
|
|
22
|
+
// Получить JSON-RPC код ошибки
|
|
23
|
+
getRpcErrorCode() {
|
|
24
|
+
return this.rpcErrorCode;
|
|
25
|
+
}
|
|
26
|
+
// Получить данные ошибки
|
|
27
|
+
getRpcData() {
|
|
28
|
+
return this.rpcData;
|
|
29
|
+
}
|
|
30
|
+
// Создать JsonRpcException из стандартного HttpException
|
|
31
|
+
static fromHttpException(exception, requestId = null) {
|
|
32
|
+
const status = exception.getStatus();
|
|
33
|
+
const response = exception.getResponse();
|
|
34
|
+
const message = typeof response === "string"
|
|
35
|
+
? response
|
|
36
|
+
: typeof response === "object" && response !== null && "message" in response
|
|
37
|
+
? String(response.message)
|
|
38
|
+
: exception.message;
|
|
39
|
+
const rpcErrorCode = mapHttpStatusToJsonRpcErrorCode(status);
|
|
40
|
+
return new JsonRpcException(rpcErrorCode, message, { requestId }, status);
|
|
41
|
+
}
|
|
42
|
+
// Создать JsonRpcException из обычной Error
|
|
43
|
+
static fromError(error, requestId = null) {
|
|
44
|
+
return new JsonRpcException(JsonRpcErrorCode.INTERNAL_ERROR, error.message, {
|
|
45
|
+
requestId,
|
|
46
|
+
name: error.name,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
// Получить HTTP статус из JSON-RPC кода ошибки
|
|
50
|
+
static getHttpStatus(rpcErrorCode) {
|
|
51
|
+
switch (rpcErrorCode) {
|
|
52
|
+
case JsonRpcErrorCode.PARSE_ERROR:
|
|
53
|
+
case JsonRpcErrorCode.INVALID_REQUEST:
|
|
54
|
+
case JsonRpcErrorCode.INVALID_PARAMS:
|
|
55
|
+
return HttpStatus.BAD_REQUEST;
|
|
56
|
+
case JsonRpcErrorCode.UNAUTHORIZED:
|
|
57
|
+
return HttpStatus.UNAUTHORIZED;
|
|
58
|
+
case JsonRpcErrorCode.FORBIDDEN:
|
|
59
|
+
return HttpStatus.FORBIDDEN;
|
|
60
|
+
case JsonRpcErrorCode.NOT_FOUND:
|
|
61
|
+
case JsonRpcErrorCode.METHOD_NOT_FOUND:
|
|
62
|
+
return HttpStatus.NOT_FOUND;
|
|
63
|
+
case JsonRpcErrorCode.TOO_MANY_REQUESTS:
|
|
64
|
+
return HttpStatus.TOO_MANY_REQUESTS;
|
|
65
|
+
case JsonRpcErrorCode.BAD_GATEWAY:
|
|
66
|
+
return HttpStatus.BAD_GATEWAY;
|
|
67
|
+
case JsonRpcErrorCode.SERVICE_UNAVAILABLE:
|
|
68
|
+
return HttpStatus.SERVICE_UNAVAILABLE;
|
|
69
|
+
case JsonRpcErrorCode.GATEWAY_TIMEOUT:
|
|
70
|
+
return HttpStatus.GATEWAY_TIMEOUT;
|
|
71
|
+
case JsonRpcErrorCode.INTERNAL_ERROR:
|
|
72
|
+
case JsonRpcErrorCode.SERVER_ERROR:
|
|
73
|
+
default:
|
|
74
|
+
return HttpStatus.INTERNAL_SERVER_ERROR;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=json-rpc.error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-rpc.error.js","sourceRoot":"","sources":["../../src/errors/json-rpc.error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EACN,gBAAgB,EAChB,uBAAuB,EACvB,+BAA+B,GAC/B,MAAM,gCAAgC,CAAC;AAExC,kDAAkD;AAClD,oEAAoE;AACpE,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,aAAa;IACzC,YAAY,CAAmB;IAC/B,OAAO,CAAW;IAEnC,YACC,YAA8B,EAC9B,OAAgB,EAChB,IAAc,EACd,UAAuB;QAEvB,MAAM,UAAU,GAAG,OAAO,IAAI,uBAAuB,CAAC,YAAY,CAAC,CAAC;QACpE,MAAM,MAAM,GAAG,UAAU,IAAI,gBAAgB,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;QAE1E,KAAK,CACJ;YACC,OAAO,EAAE,KAAK;YACd,KAAK,EAAE;gBACN,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,UAAU;gBACnB,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,EAAE,IAAI,EAAE,CAAC;aACnC;SACD,EACD,MAAM,CACN,CAAC;QAEF,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACrB,CAAC;IAED,+BAA+B;IAC/B,eAAe;QACd,OAAO,IAAI,CAAC,YAAY,CAAC;IAC1B,CAAC;IAED,yBAAyB;IACzB,UAAU;QACT,OAAO,IAAI,CAAC,OAAO,CAAC;IACrB,CAAC;IAED,yDAAyD;IACzD,MAAM,CAAC,iBAAiB,CACvB,SAAwB,EACxB,YAAoC,IAAI;QAExC,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;QACzC,MAAM,OAAO,GACZ,OAAO,QAAQ,KAAK,QAAQ;YAC3B,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,IAAI,SAAS,IAAI,QAAQ;gBAC3E,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAC1B,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC;QAEvB,MAAM,YAAY,GAAG,+BAA+B,CAAC,MAAM,CAAC,CAAC;QAE7D,OAAO,IAAI,gBAAgB,CAAC,YAAY,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;IAC3E,CAAC;IAED,4CAA4C;IAC5C,MAAM,CAAC,SAAS,CAAC,KAAY,EAAE,YAAoC,IAAI;QACtE,OAAO,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,cAAc,EAAE,KAAK,CAAC,OAAO,EAAE;YAC3E,SAAS;YACT,IAAI,EAAE,KAAK,CAAC,IAAI;SAChB,CAAC,CAAC;IACJ,CAAC;IAED,+CAA+C;IACvC,MAAM,CAAC,aAAa,CAAC,YAA8B;QAC1D,QAAQ,YAAY,EAAE,CAAC;YACtB,KAAK,gBAAgB,CAAC,WAAW,CAAC;YAClC,KAAK,gBAAgB,CAAC,eAAe,CAAC;YACtC,KAAK,gBAAgB,CAAC,cAAc;gBACnC,OAAO,UAAU,CAAC,WAAW,CAAC;YAC/B,KAAK,gBAAgB,CAAC,YAAY;gBACjC,OAAO,UAAU,CAAC,YAAY,CAAC;YAChC,KAAK,gBAAgB,CAAC,SAAS;gBAC9B,OAAO,UAAU,CAAC,SAAS,CAAC;YAC7B,KAAK,gBAAgB,CAAC,SAAS,CAAC;YAChC,KAAK,gBAAgB,CAAC,gBAAgB;gBACrC,OAAO,UAAU,CAAC,SAAS,CAAC;YAC7B,KAAK,gBAAgB,CAAC,iBAAiB;gBACtC,OAAO,UAAU,CAAC,iBAAiB,CAAC;YACrC,KAAK,gBAAgB,CAAC,WAAW;gBAChC,OAAO,UAAU,CAAC,WAAW,CAAC;YAC/B,KAAK,gBAAgB,CAAC,mBAAmB;gBACxC,OAAO,UAAU,CAAC,mBAAmB,CAAC;YACvC,KAAK,gBAAgB,CAAC,eAAe;gBACpC,OAAO,UAAU,CAAC,eAAe,CAAC;YACnC,KAAK,gBAAgB,CAAC,cAAc,CAAC;YACrC,KAAK,gBAAgB,CAAC,YAAY,CAAC;YACnC;gBACC,OAAO,UAAU,CAAC,qBAAqB,CAAC;QAC1C,CAAC;IACF,CAAC;CACD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-rpc-exception.filter.spec.d.ts","sourceRoot":"","sources":["../../../src/filters/__tests__/json-rpc-exception.filter.spec.ts"],"names":[],"mappings":""}
|