@lad-tech/nsc-toolkit 1.15.5 → 1.17.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/CHANGELOG.md CHANGED
@@ -1,6 +1,6 @@
1
- ## [1.15.5](https://github.com/lad-tech/nsc-toolkit/compare/v1.15.4...v1.15.5) (2023-09-08)
1
+ # [1.17.0](https://github.com/lad-tech/nsc-toolkit/compare/v1.16.0...v1.17.0) (2023-11-09)
2
2
 
3
3
 
4
- ### Bug Fixes
4
+ ### Features
5
5
 
6
- * add nats error code to error message ([#83](https://github.com/lad-tech/nsc-toolkit/issues/83)) ([a043b5c](https://github.com/lad-tech/nsc-toolkit/commit/a043b5cbd0b71a513d8a6db4cc4305dd4d9182c6))
6
+ * Передача и парсинг json в потоках ([8c40d92](https://github.com/lad-tech/nsc-toolkit/commit/8c40d9211055ea40668f33711f9cec5e4e0064d3)), closes [#85](https://github.com/lad-tech/nsc-toolkit/issues/85)
package/README.md CHANGED
@@ -316,6 +316,7 @@ npm i
316
316
  - Инъекция через декоратор `@service` позволяет использовать функциональность сборки приложения в монолит.
317
317
  * `@instance`:
318
318
  - Используется для инъекции других зависимостей, например, объектов репозиториев. В него можно передать готовый объект с набором асинхронных методов. При вызове этих методов из его логики они будут видны в трассировках. Для получения таких зависимостей рекомендуется использовать DI-контейнеры.
319
+ 5. Для передачи объектов в поток можно использовать встроенные классы `JsonToBufferTransform` и `BufferToJsonTransform`, с помощью которых склейка буфера при передаче и парсинг произойдет в автоматическом режиме
319
320
 
320
321
  ## Рекомендации
321
322
 
package/dist/Root.js CHANGED
@@ -57,9 +57,12 @@ class Root {
57
57
  if (error instanceof Error) {
58
58
  message = error.message;
59
59
  }
60
- else {
60
+ else if (typeof error === 'string') {
61
61
  message = error;
62
62
  }
63
+ else {
64
+ message = JSON.stringify(error);
65
+ }
63
66
  return {
64
67
  payload: null,
65
68
  error: {
package/dist/Service.js CHANGED
@@ -348,11 +348,20 @@ class Service extends Root_1.Root {
348
348
  }
349
349
  catch (error) {
350
350
  logger.debug({ request: payload });
351
- logger.error(error);
351
+ logger.error(this.createErrorMessageForLogger(error));
352
352
  this.finishSpan(span, error);
353
353
  return this.buildErrorMessage(error);
354
354
  }
355
355
  }
356
+ /**
357
+ * Make error object if error instance of Error object for logger
358
+ */
359
+ createErrorMessageForLogger(error) {
360
+ if (error instanceof Error) {
361
+ return { name: error.name, message: error.message, stack: error.stack };
362
+ }
363
+ return { message: JSON.stringify(error) };
364
+ }
356
365
  /**
357
366
  * Start service. Subscribe for subject and up http server
358
367
  */
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BufferToJsonTransform = void 0;
4
+ const stream_1 = require("stream");
5
+ class BufferToJsonTransform extends stream_1.Transform {
6
+ constructor(options) {
7
+ super({ objectMode: true, highWaterMark: 10, ...options });
8
+ this.head = Buffer.from('');
9
+ this.logger = options.logger;
10
+ }
11
+ async _transform(tail, _, cb) {
12
+ try {
13
+ tail = Buffer.concat([this.head, Buffer.from(tail)]);
14
+ const jsonData = JSON.parse(tail.toString());
15
+ cb(null, jsonData);
16
+ }
17
+ catch (error) {
18
+ if (error instanceof SyntaxError) {
19
+ this.head = Buffer.from(tail);
20
+ this.logger.error(BufferToJsonTransform.errors.CONVERSION_ERROR, tail.toString());
21
+ cb();
22
+ return;
23
+ }
24
+ cb(error);
25
+ }
26
+ }
27
+ }
28
+ exports.BufferToJsonTransform = BufferToJsonTransform;
29
+ BufferToJsonTransform.errors = {
30
+ CONVERSION_ERROR: 'Не удалось преобразовать данные',
31
+ };
32
+ //# sourceMappingURL=BufferToJsonTransform.js.map
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.JsonToBufferTransform = void 0;
4
+ const stream_1 = require("stream");
5
+ class JsonToBufferTransform extends stream_1.Transform {
6
+ transform(chunk, encoding, cb) {
7
+ cb(null, Buffer.from(JSON.stringify(chunk)));
8
+ }
9
+ }
10
+ exports.JsonToBufferTransform = JsonToBufferTransform;
11
+ //# sourceMappingURL=JsonToBufferTransform.js.map
@@ -0,0 +1,19 @@
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./JsonToBufferTransform"), exports);
18
+ __exportStar(require("./BufferToJsonTransform"), exports);
19
+ //# sourceMappingURL=index.js.map
package/dist/index.js CHANGED
@@ -20,4 +20,5 @@ __exportStar(require("./Method"), exports);
20
20
  __exportStar(require("./injector"), exports);
21
21
  __exportStar(require("./Container"), exports);
22
22
  __exportStar(require("./interfaces"), exports);
23
+ __exportStar(require("./StreamOptions"), exports);
23
24
  //# sourceMappingURL=index.js.map
@@ -17,7 +17,7 @@ export declare class Root {
17
17
  */
18
18
  protected getContext(baggage?: Baggage): opentelemetry.Context | undefined;
19
19
  protected getExpired(expired?: number, ownTimeout?: number): number;
20
- protected buildErrorMessage(error: string | Error, code?: number): {
20
+ protected buildErrorMessage(error: string | Error | Record<any, any>, code?: number): {
21
21
  payload: null;
22
22
  error: {
23
23
  message: string;
@@ -69,6 +69,10 @@ export declare class Service<E extends Emitter = Emitter> extends Root {
69
69
  * Run business logic for request
70
70
  */
71
71
  private handled;
72
+ /**
73
+ * Make error object if error instance of Error object for logger
74
+ */
75
+ private createErrorMessageForLogger;
72
76
  /**
73
77
  * Start service. Subscribe for subject and up http server
74
78
  */
@@ -0,0 +1,13 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ import { Logs } from '@lad-tech/toolbelt';
4
+ import { Transform, TransformCallback, TransformOptions } from 'stream';
5
+ export declare class BufferToJsonTransform<T = any> extends Transform {
6
+ private head;
7
+ private static errors;
8
+ private logger;
9
+ constructor(options: TransformOptions & {
10
+ logger: Logs.Logger;
11
+ });
12
+ _transform(tail: Buffer, _: BufferEncoding, cb: TransformCallback): Promise<void>;
13
+ }
@@ -0,0 +1,6 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ import { Transform, TransformCallback } from 'stream';
4
+ export declare class JsonToBufferTransform<T> extends Transform {
5
+ transform(chunk: T, encoding: BufferEncoding, cb: TransformCallback): void;
6
+ }
@@ -0,0 +1,2 @@
1
+ export * from './JsonToBufferTransform';
2
+ export * from './BufferToJsonTransform';
@@ -4,3 +4,4 @@ export * from './Method';
4
4
  export * from './injector';
5
5
  export * from './Container';
6
6
  export * from './interfaces';
7
+ export * from './StreamOptions';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lad-tech/nsc-toolkit",
3
- "version": "1.15.5",
3
+ "version": "1.17.0",
4
4
  "description": "Toolkit for create microservices around NATS",
5
5
  "main": "dist/index.js",
6
6
  "types": "./dist/types/index.d.ts",