@lad-tech/nsc-toolkit 1.3.0 → 1.4.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.
Files changed (44) hide show
  1. package/.eslintrc.json +104 -0
  2. package/.github/workflows/build-and-test.yml +22 -0
  3. package/.github/workflows/publish-package-to-npmjs.yml +5 -0
  4. package/CHANGELOG.md +2 -2
  5. package/README.md +2 -0
  6. package/coverage/clover.xml +578 -0
  7. package/coverage/coverage-final.json +12 -0
  8. package/coverage/lcov-report/base.css +224 -0
  9. package/coverage/lcov-report/block-navigation.js +87 -0
  10. package/coverage/lcov-report/favicon.png +0 -0
  11. package/coverage/lcov-report/index.html +146 -0
  12. package/coverage/lcov-report/prettify.css +1 -0
  13. package/coverage/lcov-report/prettify.js +2 -0
  14. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  15. package/coverage/lcov-report/sorter.js +196 -0
  16. package/coverage/lcov.info +1095 -0
  17. package/lefthook.yml +2 -2
  18. package/package.json +18 -10
  19. package/tsconfig.json +1 -1
  20. package/.eslintrc.js +0 -106
  21. package/dist/Client.js +0 -240
  22. package/dist/Client.js.map +0 -1
  23. package/dist/Method.js +0 -7
  24. package/dist/Method.js.map +0 -1
  25. package/dist/Root.js +0 -67
  26. package/dist/Root.js.map +0 -1
  27. package/dist/Service.js +0 -493
  28. package/dist/Service.js.map +0 -1
  29. package/dist/StreamManager.js +0 -109
  30. package/dist/StreamManager.js.map +0 -1
  31. package/dist/index.js +0 -22
  32. package/dist/index.js.map +0 -1
  33. package/dist/injector.js +0 -39
  34. package/dist/injector.js.map +0 -1
  35. package/dist/interfaces.js +0 -4
  36. package/dist/interfaces.js.map +0 -1
  37. package/dist/types/Client.d.ts +0 -29
  38. package/dist/types/Method.d.ts +0 -6
  39. package/dist/types/Root.d.ts +0 -26
  40. package/dist/types/Service.d.ts +0 -99
  41. package/dist/types/StreamManager.d.ts +0 -20
  42. package/dist/types/index.d.ts +0 -5
  43. package/dist/types/injector.d.ts +0 -11
  44. package/dist/types/interfaces.d.ts +0 -135
package/dist/injector.js DELETED
@@ -1,39 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.instance = exports.service = exports.related = exports.InstanceContainer = exports.ServiceContainer = void 0;
4
- require("reflect-metadata");
5
- const serviceMetaKey = Symbol('services');
6
- const instanceMetaKey = Symbol('instance');
7
- exports.ServiceContainer = new Map();
8
- exports.InstanceContainer = new Map();
9
- function related(target) {
10
- const dependencies = Reflect.getMetadata(serviceMetaKey, target.prototype);
11
- const instances = Reflect.getMetadata(instanceMetaKey, target.prototype);
12
- exports.ServiceContainer.set(target.settings.action, dependencies);
13
- exports.InstanceContainer.set(target.settings.action, instances);
14
- }
15
- exports.related = related;
16
- function setMetaData(item, itemName, metaKey, target) {
17
- let storage;
18
- if (Reflect.hasMetadata(metaKey, target)) {
19
- storage = Reflect.getMetadata(metaKey, target);
20
- }
21
- else {
22
- storage = new Map();
23
- Reflect.defineMetadata(metaKey, storage, target);
24
- }
25
- storage.set(itemName, item);
26
- }
27
- function service(dependence) {
28
- return function (target, dependenceName) {
29
- setMetaData(dependence, dependenceName, serviceMetaKey, target);
30
- };
31
- }
32
- exports.service = service;
33
- function instance(instance) {
34
- return function (target, instanceName) {
35
- setMetaData(instance, instanceName, instanceMetaKey, target);
36
- };
37
- }
38
- exports.instance = instance;
39
- //# sourceMappingURL=injector.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"injector.js","sourceRoot":"","sources":["../src/injector.ts"],"names":[],"mappings":";;;AAAA,4BAA0B;AAQ1B,MAAM,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;AAC1C,MAAM,eAAe,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;AAE9B,QAAA,gBAAgB,GAAmC,IAAI,GAAG,EAAE,CAAC;AAC7D,QAAA,iBAAiB,GAAiC,IAAI,GAAG,EAAE,CAAC;AAEzE,SAAgB,OAAO,CAAmB,MAAS;IACjD,MAAM,YAAY,GAAsB,OAAO,CAAC,WAAW,CAAC,cAAc,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IAC9F,MAAM,SAAS,GAAoB,OAAO,CAAC,WAAW,CAAC,eAAe,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IAC1F,wBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC3D,yBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAC3D,CAAC;AALD,0BAKC;AAED,SAAS,WAAW,CAAC,IAA2B,EAAE,QAAgB,EAAE,OAAe,EAAE,MAAW;IAC9F,IAAI,OAA6B,CAAC;IAClC,IAAI,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE;QACxC,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;KAChD;SAAM;QACL,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;QACpB,OAAO,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;KAClD;IACD,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED,SAAgB,OAAO,CAAC,UAAsB;IAC5C,OAAO,UAAU,MAAW,EAAE,cAAsB;QAClD,WAAW,CAAC,UAAU,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;IAClE,CAAC,CAAC;AACJ,CAAC;AAJD,0BAIC;AAED,SAAgB,QAAQ,CAAC,QAAkB;IACzC,OAAO,UAAU,MAAW,EAAE,YAAoB;QAChD,WAAW,CAAC,QAAQ,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;IAC/D,CAAC,CAAC;AACJ,CAAC;AAJD,4BAIC"}
@@ -1,4 +0,0 @@
1
- "use strict";
2
- // COMMON
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- //# sourceMappingURL=interfaces.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":";AAAA,SAAS"}
@@ -1,29 +0,0 @@
1
- /// <reference types="node" />
2
- import { Readable } from 'stream';
3
- import { Emitter, Listener, MethodSettings, ClientParam, GetListenerOptions } from './interfaces';
4
- import { Root } from './Root';
5
- declare type RequestData = Record<string, unknown> | Readable;
6
- export declare class Client<E extends Emitter = Emitter> extends Root {
7
- private serviceName;
8
- private baggage?;
9
- private cache?;
10
- private events?;
11
- private subscriptions;
12
- private REQUEST_HTTP_SETTINGS_TIMEOUT;
13
- constructor({ broker, events, loggerOutputFormatter, serviceName, baggage, cache }: ClientParam<E>);
14
- private startWatch;
15
- /**
16
- * Make listener for service events. Auto subscribe and unsubscribe to subject
17
- */
18
- getListener<A extends keyof E>(serviceNameFrom: string, options?: GetListenerOptions): Listener<E>;
19
- private createCacheKey;
20
- private validate;
21
- protected request<R = any, P extends RequestData = RequestData>(subject: string, data: P, { options, request, response }: MethodSettings): Promise<R>;
22
- private getHTTPSettingsFromRemoteService;
23
- private isStream;
24
- private makeBrokerRequest;
25
- private makeHttpRequest;
26
- private convertBaggaggeToExternalHeader;
27
- private isJsMessage;
28
- }
29
- export {};
@@ -1,6 +0,0 @@
1
- import { Logs } from '@lad-tech/toolbelt';
2
- import { Emitter } from './interfaces';
3
- export declare class BaseMethod<E extends Emitter = Record<string, () => void>> {
4
- protected logger: Logs.Logger;
5
- protected emitter: E;
6
- }
@@ -1,26 +0,0 @@
1
- import { Logs } from '@lad-tech/toolbelt';
2
- import * as opentelemetry from '@opentelemetry/api';
3
- import { NatsConnection } from 'nats';
4
- import { Baggage } from './interfaces';
5
- export declare class Root {
6
- protected brocker: NatsConnection;
7
- protected readonly SERVICE_SUBJECT_FOR_GET_HTTP_SETTINGS = "get_http_settings";
8
- protected readonly CACHE_SERVICE_KEY = "CACHE";
9
- protected readonly SUBJECT_DELIMITER = ".";
10
- protected logger: Logs.Logger;
11
- constructor(brocker: NatsConnection, outputFormatter?: Logs.OutputFormatter);
12
- protected castToNumber(value?: string): number;
13
- protected getSettingFromEnv(name: string, required?: boolean): string | undefined;
14
- /**
15
- * Make opentelemetry context from baggagge
16
- */
17
- protected getContext(baggage?: Baggage): opentelemetry.Context | undefined;
18
- protected getExpired(expired?: number, ownTimeout?: number): number;
19
- protected buildErrorMessage(error: string | Error, code?: number): {
20
- payload: null;
21
- error: {
22
- message: string;
23
- code: number | undefined;
24
- };
25
- };
26
- }
@@ -1,99 +0,0 @@
1
- import { Root } from './Root';
2
- import { Emitter, ServiceOptions, Baggage, ExternalBaggage, ClientService } from './interfaces';
3
- export declare class Service<E extends Emitter = Emitter> extends Root {
4
- private options;
5
- emitter: E;
6
- private serviceName;
7
- private httpServer?;
8
- private httpProbServer?;
9
- protected httpPort?: number;
10
- protected ipAddress?: string;
11
- private subscriptions;
12
- private httpMethods;
13
- private rootSpans;
14
- constructor(options: ServiceOptions<E>);
15
- /**
16
- * Create global Tracer
17
- */
18
- private createTracer;
19
- /**
20
- * Wrapper for async methods. Create span
21
- */
22
- private perform;
23
- /**
24
- * Creating an object to inject into Method (business logic)
25
- */
26
- private createObjectWithDependencies;
27
- /**
28
- * Create Method (business logic) context
29
- */
30
- private createMethodContext;
31
- /**
32
- * Create Baggage from span. Expired one-on-one business logic call
33
- */
34
- private getNextBaggage;
35
- /**
36
- * If there is no baggage. For example, in HTTP Gateway
37
- */
38
- getRootBaggage(subject: string, headers?: ExternalBaggage, ownTimeout?: number): {
39
- expired: number;
40
- traceId: string;
41
- spanId: string;
42
- traceFlags: number;
43
- };
44
- /**
45
- * End root baggage
46
- */
47
- endRootSpan(traceId: string, error?: Error): void;
48
- buildService<C extends ClientService>(Client: C, baggage?: Baggage): InstanceType<C>;
49
- /**
50
- * Create service Method for send HTTP settings
51
- */
52
- private runServiceMethodForHttp;
53
- private makeHttpSingleResponse;
54
- /**
55
- * Create transform stream for convert object to string in stream pipeline
56
- */
57
- private getStringifyTransform;
58
- private makeHttpStreamResponse;
59
- /**
60
- * Up HTTP server and start listen http routes
61
- */
62
- private buildHTTPHandlers;
63
- /**
64
- * Run business logic for request
65
- */
66
- private handled;
67
- /**
68
- * Start service. Subscribe for subject and up http server
69
- */
70
- start(): Promise<void>;
71
- /**
72
- * Correct finish all connections
73
- */
74
- private cleanupAndExit;
75
- /**
76
- * Handler for OS Signal
77
- */
78
- private handleSignal;
79
- /**
80
- * Handler for Force OS Signal
81
- */
82
- private handleFatalError;
83
- /**
84
- * Register listeners for Graceful Shutdown
85
- */
86
- private registerGracefulShutdown;
87
- /**
88
- * Up Probe Route for container orchestration service
89
- */
90
- private upProbeRoutes;
91
- /**
92
- * Build message for broker
93
- */
94
- private buildMessage;
95
- private upHTTPServer;
96
- private getMyIpV4;
97
- private getHttpSettings;
98
- private getBaggageFromHTTPHeader;
99
- }
@@ -1,20 +0,0 @@
1
- import { StreamManagerParam, GetListenerOptions } from '.';
2
- import { JetStreamSubscription } from 'nats';
3
- import { Root } from './Root';
4
- export declare class StreamManager extends Root {
5
- private param;
6
- private readonly STAR_WILDCARD;
7
- private readonly GREATER_WILDCARD;
8
- private readonly TWO_WEEKS_IN_SECOND;
9
- private readonly ONE_DAY_IN_SECOND;
10
- private readonly defaultStreamOption;
11
- private jsm?;
12
- constructor(param: StreamManagerParam);
13
- createStreams(): Promise<void>;
14
- createConsumer(serviceNameFrom: string, eventName: string, setting?: GetListenerOptions): Promise<JetStreamSubscription>;
15
- private getStreamName;
16
- private isNotFoundStreamError;
17
- private buildPrefixForStreamName;
18
- private capitalizeFirstLetter;
19
- private convertSecondsToNanoseconds;
20
- }
@@ -1,5 +0,0 @@
1
- export * from './Service';
2
- export * from './Client';
3
- export * from './Method';
4
- export * from './injector';
5
- export * from './interfaces';
@@ -1,11 +0,0 @@
1
- import 'reflect-metadata';
2
- import { Method, ClientService } from './interfaces';
3
- export declare type Instance = Record<string, (props: unknown) => Promise<unknown>>;
4
- export declare type Dependence = ClientService<unknown>;
5
- export declare type DependenceStorage = Map<string, Dependence>;
6
- export declare type InstanceStorage = Map<string, Instance>;
7
- export declare const ServiceContainer: Map<string, DependenceStorage>;
8
- export declare const InstanceContainer: Map<string, InstanceStorage>;
9
- export declare function related<T extends Method>(target: T): void;
10
- export declare function service(dependence: Dependence): (target: any, dependenceName: string) => void;
11
- export declare function instance(instance: Instance): (target: any, instanceName: string) => void;
@@ -1,135 +0,0 @@
1
- import type { NatsConnection } from 'nats';
2
- import type { Client } from './Client';
3
- import type { Logs } from '@lad-tech/toolbelt';
4
- export interface MethodOptions {
5
- useStream?: {
6
- request?: boolean;
7
- response?: boolean;
8
- };
9
- cache?: number;
10
- timeout?: number;
11
- runTimeValidation?: {
12
- request?: boolean;
13
- response?: boolean;
14
- };
15
- }
16
- export interface MethodSettings {
17
- action: string;
18
- options?: MethodOptions;
19
- request?: Record<string, unknown>;
20
- response?: Record<string, unknown>;
21
- }
22
- export interface Method {
23
- settings: MethodSettings;
24
- new (): {
25
- handler: (params: any) => Promise<any>;
26
- };
27
- }
28
- export declare type ClientService<C = Client> = new (natsConnection: NatsConnection, baggage?: Baggage, cache?: CacheSettings, loggerOutputFormatter?: Logs.OutputFormatter) => C;
29
- export declare type Baggage = {
30
- traceId: string;
31
- spanId: string;
32
- traceFlags: number;
33
- expired?: number;
34
- };
35
- export declare type ExternalBaggage = {
36
- 'nsc-expired'?: number;
37
- 'nsc-trace-id'?: string;
38
- 'nsc-span-id'?: string;
39
- 'nsc-trace-flags'?: number;
40
- };
41
- export interface Message<M = any> {
42
- payload: M;
43
- baggage?: Baggage;
44
- error?: {
45
- message: string;
46
- code?: number;
47
- };
48
- }
49
- export declare type Emitter = Record<string, (params: unknown) => void>;
50
- export interface CacheSettings {
51
- service: CacheService;
52
- timeout: number;
53
- }
54
- export interface GracefulShutdownAdditionalService {
55
- close: () => Promise<any>;
56
- }
57
- export interface ClientParam<E extends Emitter = Emitter> {
58
- broker: NatsConnection;
59
- serviceName: string;
60
- baggage?: Baggage;
61
- cache?: CacheSettings;
62
- loggerOutputFormatter?: Logs.OutputFormatter;
63
- events?: Events<E>;
64
- }
65
- export interface GetListenerOptions {
66
- queue?: string;
67
- deliver?: 'all' | 'new';
68
- maxPending?: number;
69
- }
70
- export interface StreamManagerParam {
71
- serviceName: string;
72
- options: StreamOptions;
73
- broker: NatsConnection;
74
- outputFormatter?: Logs.OutputFormatter;
75
- }
76
- export interface EmitterEvent<D extends Record<string, any>> {
77
- data: D;
78
- }
79
- export interface EmitterStreamEvent<D extends Record<string, any>> extends EmitterEvent<D> {
80
- ack: () => void;
81
- nak: (millis: number) => void;
82
- }
83
- export interface StreamAction {
84
- action: string;
85
- storage?: 'file' | 'memory' | string;
86
- retentionPolicy?: 'limits' | 'interest' | 'workQueue' | string;
87
- discardPolicy?: 'old' | 'new' | string;
88
- messageTTL?: number;
89
- duplicateTrackingTime?: number;
90
- replication?: number;
91
- rollUps?: boolean;
92
- }
93
- export interface StreamOptions {
94
- prefix: string;
95
- actions: StreamAction[];
96
- }
97
- export interface Event {
98
- action: string;
99
- options?: {
100
- stream?: boolean;
101
- };
102
- description: string;
103
- event: Record<string, unknown>;
104
- }
105
- export interface Events<E extends Emitter> {
106
- list: Record<keyof E, Event>;
107
- streamOptions: StreamOptions;
108
- }
109
- export interface ServiceOptions<E extends Emitter> {
110
- name: string;
111
- brokerConnection: NatsConnection;
112
- methods: Method[];
113
- events?: Events<E>;
114
- cache?: CacheSettings;
115
- loggerOutputFormatter?: Logs.OutputFormatter;
116
- gracefulShutdown?: {
117
- additional?: GracefulShutdownAdditionalService[];
118
- timeout?: number;
119
- };
120
- }
121
- export declare type EventStreamHandler<P extends Record<string, any>> = (params: EmitterStreamEvent<P>) => void;
122
- export declare type EventHandler<P extends Record<string, any>> = (params: EmitterEvent<P>) => void;
123
- export interface Listener<E extends Emitter> {
124
- on<A extends keyof E>(action: A, handler: E[A]): void;
125
- off<A extends keyof E>(action: A, handler: E[A]): void;
126
- }
127
- export interface HttpSettings {
128
- ip?: string;
129
- port?: number;
130
- }
131
- export interface CacheService {
132
- set: (key: string, value: string, expired?: number) => Promise<void>;
133
- get: (key: string) => Promise<string | undefined>;
134
- delete: (key: string) => Promise<void>;
135
- }