@lad-tech/nsc-toolkit 0.5.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/.eslintrc.js +105 -0
- package/.github/workflows/publish-package-to-npmjs.yml +18 -0
- package/.prettierrc.json +9 -0
- package/LICENSE +21 -0
- package/README.md +118 -0
- package/dist/Client.js +198 -0
- package/dist/Client.js.map +1 -0
- package/dist/Method.js +7 -0
- package/dist/Method.js.map +1 -0
- package/dist/Root.js +66 -0
- package/dist/Root.js.map +1 -0
- package/dist/Service.js +387 -0
- package/dist/Service.js.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/injector.js +39 -0
- package/dist/injector.js.map +1 -0
- package/dist/interfaces.js +4 -0
- package/dist/interfaces.js.map +1 -0
- package/dist/types/Client.d.ts +25 -0
- package/dist/types/Method.d.ts +6 -0
- package/dist/types/Root.d.ts +26 -0
- package/dist/types/Service.d.ts +78 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/injector.d.ts +11 -0
- package/dist/types/interfaces.d.ts +72 -0
- package/examples/HttpGate/index.ts +61 -0
- package/examples/HttpGate/package-lock.json +835 -0
- package/examples/HttpGate/package.json +15 -0
- package/examples/LogicService/index.ts +16 -0
- package/examples/LogicService/interfaces.ts +10 -0
- package/examples/LogicService/methods/WeirdSum.ts +20 -0
- package/examples/LogicService/service.json +31 -0
- package/examples/LogicService/service.ts +15 -0
- package/examples/MathService/Untitled-1.json +62 -0
- package/examples/MathService/index.ts +22 -0
- package/examples/MathService/interfaces.ts +26 -0
- package/examples/MathService/methods/Fibonacci.ts +29 -0
- package/examples/MathService/methods/Sum.ts +16 -0
- package/examples/MathService/methods/SumStream.ts +18 -0
- package/examples/MathService/service.json +64 -0
- package/examples/MathService/service.ts +18 -0
- package/examples/SimpleCache.ts +21 -0
- package/examples/misc/trace_1.png +0 -0
- package/examples/misc/trace_2.png +0 -0
- package/package.json +41 -0
- package/src/Client.ts +237 -0
- package/src/Method.ts +7 -0
- package/src/Root.ts +69 -0
- package/src/Service.ts +419 -0
- package/src/index.ts +5 -0
- package/src/injector.ts +43 -0
- package/src/interfaces.ts +89 -0
- package/tsconfig.json +19 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { NatsConnection } from 'nats';
|
|
2
|
+
import type { Client } from './Client';
|
|
3
|
+
export interface MethodOptions {
|
|
4
|
+
useStream?: {
|
|
5
|
+
request?: boolean;
|
|
6
|
+
response?: boolean;
|
|
7
|
+
};
|
|
8
|
+
cache?: number;
|
|
9
|
+
timeout?: number;
|
|
10
|
+
runTimeValidation?: {
|
|
11
|
+
request?: boolean;
|
|
12
|
+
response?: boolean;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export interface MethodSettings {
|
|
16
|
+
action: string;
|
|
17
|
+
options?: MethodOptions;
|
|
18
|
+
request?: Record<string, unknown>;
|
|
19
|
+
response?: Record<string, unknown>;
|
|
20
|
+
}
|
|
21
|
+
export interface Method {
|
|
22
|
+
settings: MethodSettings;
|
|
23
|
+
new (): {
|
|
24
|
+
handler: (params: unknown) => Promise<unknown>;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export declare type ClientService<C = Client> = new (natsConnection: NatsConnection, baggage?: Baggage, cache?: CacheSettings) => C;
|
|
28
|
+
export declare type Baggage = {
|
|
29
|
+
traceId: string;
|
|
30
|
+
spanId: string;
|
|
31
|
+
traceFlags: number;
|
|
32
|
+
expired?: number;
|
|
33
|
+
};
|
|
34
|
+
export declare type ExternalBaggage = {
|
|
35
|
+
'nsc-expired'?: number;
|
|
36
|
+
'nsc-trace-id'?: string;
|
|
37
|
+
'nsc-span-id'?: string;
|
|
38
|
+
'nsc-trace-flags'?: number;
|
|
39
|
+
};
|
|
40
|
+
export interface Message<M = any> {
|
|
41
|
+
payload: M;
|
|
42
|
+
baggage?: Baggage;
|
|
43
|
+
error?: {
|
|
44
|
+
message: string;
|
|
45
|
+
code?: number;
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
export declare type Emitter = Record<string, (params: unknown) => void>;
|
|
49
|
+
export interface CacheSettings {
|
|
50
|
+
service: CacheService;
|
|
51
|
+
timeout: number;
|
|
52
|
+
}
|
|
53
|
+
export interface ServiceOptions<E extends Emitter> {
|
|
54
|
+
name: string;
|
|
55
|
+
brokerConnection: NatsConnection;
|
|
56
|
+
methods: Method[];
|
|
57
|
+
events: keyof E extends [] ? [] : [keyof E];
|
|
58
|
+
cache?: CacheSettings;
|
|
59
|
+
}
|
|
60
|
+
export interface Listener<E extends Emitter> {
|
|
61
|
+
on<A extends keyof E>(action: A, handler: E[A]): void;
|
|
62
|
+
off<A extends keyof E>(action: A, handler: E[A]): void;
|
|
63
|
+
}
|
|
64
|
+
export interface HttpSettings {
|
|
65
|
+
ip?: string;
|
|
66
|
+
port?: number;
|
|
67
|
+
}
|
|
68
|
+
export interface CacheService {
|
|
69
|
+
set: (key: string, value: string, expired?: number) => Promise<void>;
|
|
70
|
+
get: (key: string) => Promise<string | undefined>;
|
|
71
|
+
delete: (key: string) => Promise<void>;
|
|
72
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { connect } from 'nats';
|
|
2
|
+
import LogicService, { WeirdSumRequest } from '../LogicService';
|
|
3
|
+
import { Service } from '../../src/Service';
|
|
4
|
+
import { SimpleCache } from '../SimpleCache';
|
|
5
|
+
import { Logs } from '@lad-tech/toolbelt';
|
|
6
|
+
import Fastify from 'fastify';
|
|
7
|
+
import { Baggage, ExternalBaggage } from '../../src/interfaces';
|
|
8
|
+
|
|
9
|
+
declare module 'fastify' {
|
|
10
|
+
interface FastifyRequest {
|
|
11
|
+
baggage: Baggage;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const HTTP_SERVICE_PORT = 8000;
|
|
16
|
+
const logger = new Logs.Logger({ location: 'HttpGate' });
|
|
17
|
+
|
|
18
|
+
const upHttpGate = async (service: Service) => {
|
|
19
|
+
const fastify = Fastify();
|
|
20
|
+
|
|
21
|
+
fastify.decorateRequest('baggage', null);
|
|
22
|
+
|
|
23
|
+
fastify.addHook<{ Headers: ExternalBaggage }>('preHandler', (request, reply, done) => {
|
|
24
|
+
request.baggage = service.getRootBaggage(request.routerPath, request.headers);
|
|
25
|
+
reply.header('trace-id', request.baggage.traceId);
|
|
26
|
+
done();
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
fastify.addHook<{ Headers: ExternalBaggage }>('onResponse', (request, reply, done) => {
|
|
30
|
+
service.endRootSpan(request.baggage.traceId);
|
|
31
|
+
done();
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
fastify.post<{ Body: WeirdSumRequest }>('/math/weird/sum', async request => {
|
|
35
|
+
return await service.buildService(LogicService, request.baggage).weirdSum(request.body);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
await fastify.listen({ port: HTTP_SERVICE_PORT });
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const start = async () => {
|
|
42
|
+
try {
|
|
43
|
+
const brokerConnection = await connect({ servers: ['localhost:4222'] });
|
|
44
|
+
const service = new Service({
|
|
45
|
+
brokerConnection,
|
|
46
|
+
name: 'HttpGate',
|
|
47
|
+
methods: [],
|
|
48
|
+
events: [],
|
|
49
|
+
cache: { service: new SimpleCache(), timeout: 100 },
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
await service.start();
|
|
53
|
+
await upHttpGate(service);
|
|
54
|
+
logger.info('Http server start on port:', HTTP_SERVICE_PORT);
|
|
55
|
+
} catch (error) {
|
|
56
|
+
logger.error(error);
|
|
57
|
+
process.exit(1);
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
start();
|