@morojs/moro 1.6.8 → 1.7.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 +3 -1
- package/dist/core/auth/morojs-adapter.js +16 -6
- package/dist/core/auth/morojs-adapter.js.map +1 -1
- package/dist/core/config/config-sources.js +27 -15
- package/dist/core/config/config-sources.js.map +1 -1
- package/dist/core/config/config-validator.js +201 -6
- package/dist/core/config/config-validator.js.map +1 -1
- package/dist/core/docs/openapi-generator.js +8 -9
- package/dist/core/docs/openapi-generator.js.map +1 -1
- package/dist/core/events/event-bus.js +1 -1
- package/dist/core/events/event-bus.js.map +1 -1
- package/dist/core/framework.d.ts +4 -2
- package/dist/core/framework.js +25 -24
- package/dist/core/framework.js.map +1 -1
- package/dist/core/graphql/core.js +34 -8
- package/dist/core/graphql/core.js.map +1 -1
- package/dist/core/grpc/adapters/grpc-js-adapter.d.ts +28 -0
- package/dist/core/grpc/adapters/grpc-js-adapter.js +449 -0
- package/dist/core/grpc/adapters/grpc-js-adapter.js.map +1 -0
- package/dist/core/grpc/adapters/index.d.ts +1 -0
- package/dist/core/grpc/adapters/index.js +6 -0
- package/dist/core/grpc/adapters/index.js.map +1 -0
- package/dist/core/grpc/grpc-adapter.d.ts +47 -0
- package/dist/core/grpc/grpc-adapter.js +4 -0
- package/dist/core/grpc/grpc-adapter.js.map +1 -0
- package/dist/core/grpc/grpc-manager.d.ts +59 -0
- package/dist/core/grpc/grpc-manager.js +218 -0
- package/dist/core/grpc/grpc-manager.js.map +1 -0
- package/dist/core/grpc/index.d.ts +7 -0
- package/dist/core/grpc/index.js +10 -0
- package/dist/core/grpc/index.js.map +1 -0
- package/dist/core/grpc/middleware/auth.d.ts +22 -0
- package/dist/core/grpc/middleware/auth.js +126 -0
- package/dist/core/grpc/middleware/auth.js.map +1 -0
- package/dist/core/grpc/middleware/logging.d.ts +19 -0
- package/dist/core/grpc/middleware/logging.js +57 -0
- package/dist/core/grpc/middleware/logging.js.map +1 -0
- package/dist/core/grpc/middleware/validation.d.ts +18 -0
- package/dist/core/grpc/middleware/validation.js +126 -0
- package/dist/core/grpc/middleware/validation.js.map +1 -0
- package/dist/core/grpc/types.d.ts +233 -0
- package/dist/core/grpc/types.js +36 -0
- package/dist/core/grpc/types.js.map +1 -0
- package/dist/core/http/http-server.d.ts +13 -84
- package/dist/core/http/http-server.js +205 -792
- package/dist/core/http/http-server.js.map +1 -1
- package/dist/core/http/http2-server.d.ts +131 -0
- package/dist/core/http/http2-server.js +803 -0
- package/dist/core/http/http2-server.js.map +1 -0
- package/dist/core/http/index.d.ts +3 -1
- package/dist/core/http/index.js +2 -1
- package/dist/core/http/index.js.map +1 -1
- package/dist/core/http/uws-http-server.js +21 -26
- package/dist/core/http/uws-http-server.js.map +1 -1
- package/dist/core/jobs/job-executor.js +6 -1
- package/dist/core/jobs/job-executor.js.map +1 -1
- package/dist/core/jobs/job-scheduler.js +4 -1
- package/dist/core/jobs/job-scheduler.js.map +1 -1
- package/dist/core/jobs/leader-election.js +2 -1
- package/dist/core/jobs/leader-election.js.map +1 -1
- package/dist/core/logger/logger.js +41 -18
- package/dist/core/logger/logger.js.map +1 -1
- package/dist/core/logger/outputs.js +9 -3
- package/dist/core/logger/outputs.js.map +1 -1
- package/dist/core/mail/adapters/console-adapter.d.ts +14 -0
- package/dist/core/mail/adapters/console-adapter.js +89 -0
- package/dist/core/mail/adapters/console-adapter.js.map +1 -0
- package/dist/core/mail/adapters/index.d.ts +5 -0
- package/dist/core/mail/adapters/index.js +8 -0
- package/dist/core/mail/adapters/index.js.map +1 -0
- package/dist/core/mail/adapters/nodemailer-adapter.d.ts +18 -0
- package/dist/core/mail/adapters/nodemailer-adapter.js +188 -0
- package/dist/core/mail/adapters/nodemailer-adapter.js.map +1 -0
- package/dist/core/mail/adapters/resend-adapter.d.ts +18 -0
- package/dist/core/mail/adapters/resend-adapter.js +169 -0
- package/dist/core/mail/adapters/resend-adapter.js.map +1 -0
- package/dist/core/mail/adapters/sendgrid-adapter.d.ts +19 -0
- package/dist/core/mail/adapters/sendgrid-adapter.js +186 -0
- package/dist/core/mail/adapters/sendgrid-adapter.js.map +1 -0
- package/dist/core/mail/adapters/ses-adapter.d.ts +18 -0
- package/dist/core/mail/adapters/ses-adapter.js +167 -0
- package/dist/core/mail/adapters/ses-adapter.js.map +1 -0
- package/dist/core/mail/index.d.ts +5 -0
- package/dist/core/mail/index.js +8 -0
- package/dist/core/mail/index.js.map +1 -0
- package/dist/core/mail/mail-adapter.d.ts +62 -0
- package/dist/core/mail/mail-adapter.js +83 -0
- package/dist/core/mail/mail-adapter.js.map +1 -0
- package/dist/core/mail/mail-manager.d.ts +63 -0
- package/dist/core/mail/mail-manager.js +302 -0
- package/dist/core/mail/mail-manager.js.map +1 -0
- package/dist/core/mail/template-engine.d.ts +43 -0
- package/dist/core/mail/template-engine.js +239 -0
- package/dist/core/mail/template-engine.js.map +1 -0
- package/dist/core/mail/types.d.ts +237 -0
- package/dist/core/mail/types.js +4 -0
- package/dist/core/mail/types.js.map +1 -0
- package/dist/core/middleware/built-in/body-size/core.d.ts +12 -0
- package/dist/core/middleware/built-in/body-size/core.js +52 -0
- package/dist/core/middleware/built-in/body-size/core.js.map +1 -0
- package/dist/core/middleware/built-in/body-size/hook.d.ts +2 -0
- package/dist/core/middleware/built-in/body-size/hook.js +12 -0
- package/dist/core/middleware/built-in/body-size/hook.js.map +1 -0
- package/dist/core/middleware/built-in/body-size/index.d.ts +6 -0
- package/dist/core/middleware/built-in/body-size/index.js +7 -0
- package/dist/core/middleware/built-in/body-size/index.js.map +1 -0
- package/dist/core/middleware/built-in/body-size/middleware.d.ts +14 -0
- package/dist/core/middleware/built-in/body-size/middleware.js +22 -0
- package/dist/core/middleware/built-in/body-size/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/cache/core.d.ts +20 -1
- package/dist/core/middleware/built-in/cache/core.js.map +1 -1
- package/dist/core/middleware/built-in/cache/hook.d.ts +38 -1
- package/dist/core/middleware/built-in/cache/hook.js +202 -16
- package/dist/core/middleware/built-in/cache/hook.js.map +1 -1
- package/dist/core/middleware/built-in/cache/index.js +1 -1
- package/dist/core/middleware/built-in/cache/index.js.map +1 -1
- package/dist/core/middleware/built-in/compression/core.d.ts +16 -0
- package/dist/core/middleware/built-in/compression/core.js +75 -0
- package/dist/core/middleware/built-in/compression/core.js.map +1 -0
- package/dist/core/middleware/built-in/compression/hook.d.ts +2 -0
- package/dist/core/middleware/built-in/compression/hook.js +14 -0
- package/dist/core/middleware/built-in/compression/hook.js.map +1 -0
- package/dist/core/middleware/built-in/compression/index.d.ts +6 -0
- package/dist/core/middleware/built-in/compression/index.js +7 -0
- package/dist/core/middleware/built-in/compression/index.js.map +1 -0
- package/dist/core/middleware/built-in/compression/middleware.d.ts +20 -0
- package/dist/core/middleware/built-in/compression/middleware.js +28 -0
- package/dist/core/middleware/built-in/compression/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/cookie/core.js +37 -9
- package/dist/core/middleware/built-in/cookie/core.js.map +1 -1
- package/dist/core/middleware/built-in/helmet/core.d.ts +19 -0
- package/dist/core/middleware/built-in/helmet/core.js +70 -0
- package/dist/core/middleware/built-in/helmet/core.js.map +1 -0
- package/dist/core/middleware/built-in/helmet/hook.d.ts +2 -0
- package/dist/core/middleware/built-in/helmet/hook.js +12 -0
- package/dist/core/middleware/built-in/helmet/hook.js.map +1 -0
- package/dist/core/middleware/built-in/helmet/index.d.ts +6 -0
- package/dist/core/middleware/built-in/helmet/index.js +7 -0
- package/dist/core/middleware/built-in/helmet/index.js.map +1 -0
- package/dist/core/middleware/built-in/helmet/middleware.d.ts +22 -0
- package/dist/core/middleware/built-in/helmet/middleware.js +28 -0
- package/dist/core/middleware/built-in/helmet/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/http2/core.d.ts +35 -0
- package/dist/core/middleware/built-in/http2/core.js +128 -0
- package/dist/core/middleware/built-in/http2/core.js.map +1 -0
- package/dist/core/middleware/built-in/http2/hook.d.ts +5 -0
- package/dist/core/middleware/built-in/http2/hook.js +34 -0
- package/dist/core/middleware/built-in/http2/hook.js.map +1 -0
- package/dist/core/middleware/built-in/http2/index.d.ts +8 -0
- package/dist/core/middleware/built-in/http2/index.js +10 -0
- package/dist/core/middleware/built-in/http2/index.js.map +1 -0
- package/dist/core/middleware/built-in/http2/middleware.d.ts +20 -0
- package/dist/core/middleware/built-in/http2/middleware.js +31 -0
- package/dist/core/middleware/built-in/http2/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/index.d.ts +18 -0
- package/dist/core/middleware/built-in/index.js +28 -0
- package/dist/core/middleware/built-in/index.js.map +1 -1
- package/dist/core/middleware/built-in/range/core.d.ts +16 -0
- package/dist/core/middleware/built-in/range/core.js +112 -0
- package/dist/core/middleware/built-in/range/core.js.map +1 -0
- package/dist/core/middleware/built-in/range/hook.d.ts +2 -0
- package/dist/core/middleware/built-in/range/hook.js +12 -0
- package/dist/core/middleware/built-in/range/hook.js.map +1 -0
- package/dist/core/middleware/built-in/range/index.d.ts +6 -0
- package/dist/core/middleware/built-in/range/index.js +7 -0
- package/dist/core/middleware/built-in/range/index.js.map +1 -0
- package/dist/core/middleware/built-in/range/middleware.d.ts +21 -0
- package/dist/core/middleware/built-in/range/middleware.js +27 -0
- package/dist/core/middleware/built-in/range/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/session/core.js +14 -1
- package/dist/core/middleware/built-in/session/core.js.map +1 -1
- package/dist/core/middleware/built-in/static/core.d.ts +20 -0
- package/dist/core/middleware/built-in/static/core.js +143 -0
- package/dist/core/middleware/built-in/static/core.js.map +1 -0
- package/dist/core/middleware/built-in/static/hook.d.ts +2 -0
- package/dist/core/middleware/built-in/static/hook.js +12 -0
- package/dist/core/middleware/built-in/static/hook.js.map +1 -0
- package/dist/core/middleware/built-in/static/index.d.ts +6 -0
- package/dist/core/middleware/built-in/static/index.js +7 -0
- package/dist/core/middleware/built-in/static/index.js.map +1 -0
- package/dist/core/middleware/built-in/static/middleware.d.ts +18 -0
- package/dist/core/middleware/built-in/static/middleware.js +26 -0
- package/dist/core/middleware/built-in/static/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/template/core.d.ts +19 -0
- package/dist/core/middleware/built-in/template/core.js +108 -0
- package/dist/core/middleware/built-in/template/core.js.map +1 -0
- package/dist/core/middleware/built-in/template/hook.d.ts +2 -0
- package/dist/core/middleware/built-in/template/hook.js +12 -0
- package/dist/core/middleware/built-in/template/hook.js.map +1 -0
- package/dist/core/middleware/built-in/template/index.d.ts +6 -0
- package/dist/core/middleware/built-in/template/index.js +7 -0
- package/dist/core/middleware/built-in/template/index.js.map +1 -0
- package/dist/core/middleware/built-in/template/middleware.d.ts +21 -0
- package/dist/core/middleware/built-in/template/middleware.js +27 -0
- package/dist/core/middleware/built-in/template/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/upload/core.d.ts +29 -0
- package/dist/core/middleware/built-in/upload/core.js +66 -0
- package/dist/core/middleware/built-in/upload/core.js.map +1 -0
- package/dist/core/middleware/built-in/upload/hook.d.ts +2 -0
- package/dist/core/middleware/built-in/upload/hook.js +25 -0
- package/dist/core/middleware/built-in/upload/hook.js.map +1 -0
- package/dist/core/middleware/built-in/upload/index.d.ts +6 -0
- package/dist/core/middleware/built-in/upload/index.js +7 -0
- package/dist/core/middleware/built-in/upload/index.js.map +1 -0
- package/dist/core/middleware/built-in/upload/middleware.d.ts +18 -0
- package/dist/core/middleware/built-in/upload/middleware.js +41 -0
- package/dist/core/middleware/built-in/upload/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/validation/middleware.js +2 -1
- package/dist/core/middleware/built-in/validation/middleware.js.map +1 -1
- package/dist/core/networking/adapters/uws-adapter.js +54 -6
- package/dist/core/networking/adapters/uws-adapter.js.map +1 -1
- package/dist/core/networking/adapters/ws-adapter.js +56 -17
- package/dist/core/networking/adapters/ws-adapter.js.map +1 -1
- package/dist/core/pooling/object-pool-manager.js +9 -1
- package/dist/core/pooling/object-pool-manager.js.map +1 -1
- package/dist/core/queue/adapters/bull-adapter.d.ts +86 -0
- package/dist/core/queue/adapters/bull-adapter.js +330 -0
- package/dist/core/queue/adapters/bull-adapter.js.map +1 -0
- package/dist/core/queue/adapters/index.d.ts +9 -0
- package/dist/core/queue/adapters/index.js +10 -0
- package/dist/core/queue/adapters/index.js.map +1 -0
- package/dist/core/queue/adapters/kafka-adapter.d.ts +86 -0
- package/dist/core/queue/adapters/kafka-adapter.js +462 -0
- package/dist/core/queue/adapters/kafka-adapter.js.map +1 -0
- package/dist/core/queue/adapters/memory-adapter.d.ts +87 -0
- package/dist/core/queue/adapters/memory-adapter.js +415 -0
- package/dist/core/queue/adapters/memory-adapter.js.map +1 -0
- package/dist/core/queue/adapters/rabbitmq-adapter.d.ts +86 -0
- package/dist/core/queue/adapters/rabbitmq-adapter.js +436 -0
- package/dist/core/queue/adapters/rabbitmq-adapter.js.map +1 -0
- package/dist/core/queue/adapters/sqs-adapter.d.ts +102 -0
- package/dist/core/queue/adapters/sqs-adapter.js +522 -0
- package/dist/core/queue/adapters/sqs-adapter.js.map +1 -0
- package/dist/core/queue/index.d.ts +11 -0
- package/dist/core/queue/index.js +14 -0
- package/dist/core/queue/index.js.map +1 -0
- package/dist/core/queue/middleware/index.d.ts +7 -0
- package/dist/core/queue/middleware/index.js +8 -0
- package/dist/core/queue/middleware/index.js.map +1 -0
- package/dist/core/queue/middleware/monitoring.d.ts +84 -0
- package/dist/core/queue/middleware/monitoring.js +145 -0
- package/dist/core/queue/middleware/monitoring.js.map +1 -0
- package/dist/core/queue/middleware/priority.d.ts +61 -0
- package/dist/core/queue/middleware/priority.js +90 -0
- package/dist/core/queue/middleware/priority.js.map +1 -0
- package/dist/core/queue/middleware/rate-limit.d.ts +34 -0
- package/dist/core/queue/middleware/rate-limit.js +109 -0
- package/dist/core/queue/middleware/rate-limit.js.map +1 -0
- package/dist/core/queue/queue-adapter.d.ts +73 -0
- package/dist/core/queue/queue-adapter.js +20 -0
- package/dist/core/queue/queue-adapter.js.map +1 -0
- package/dist/core/queue/queue-manager.d.ts +92 -0
- package/dist/core/queue/queue-manager.js +327 -0
- package/dist/core/queue/queue-manager.js.map +1 -0
- package/dist/core/queue/types.d.ts +205 -0
- package/dist/core/queue/types.js +6 -0
- package/dist/core/queue/types.js.map +1 -0
- package/dist/core/routing/index.js +41 -10
- package/dist/core/routing/index.js.map +1 -1
- package/dist/core/routing/radix-tree.d.ts +48 -0
- package/dist/core/routing/radix-tree.js +211 -0
- package/dist/core/routing/radix-tree.js.map +1 -0
- package/dist/core/routing/router.d.ts +10 -9
- package/dist/core/routing/router.js +3 -1
- package/dist/core/routing/router.js.map +1 -1
- package/dist/core/routing/unified-router.d.ts +18 -12
- package/dist/core/routing/unified-router.js +220 -163
- package/dist/core/routing/unified-router.js.map +1 -1
- package/dist/core/runtime/aws-lambda-adapter.js +21 -10
- package/dist/core/runtime/aws-lambda-adapter.js.map +1 -1
- package/dist/core/runtime/base-adapter.js +15 -5
- package/dist/core/runtime/base-adapter.js.map +1 -1
- package/dist/core/runtime/cloudflare-workers-adapter.js +35 -12
- package/dist/core/runtime/cloudflare-workers-adapter.js.map +1 -1
- package/dist/core/runtime/vercel-edge-adapter.js +16 -6
- package/dist/core/runtime/vercel-edge-adapter.js.map +1 -1
- package/dist/core/utilities/container.js +3 -1
- package/dist/core/utilities/container.js.map +1 -1
- package/dist/core/workers/facade.d.ts +74 -0
- package/dist/core/workers/facade.js +98 -0
- package/dist/core/workers/facade.js.map +1 -0
- package/dist/core/workers/index.d.ts +2 -0
- package/dist/core/workers/index.js +6 -0
- package/dist/core/workers/index.js.map +1 -0
- package/dist/core/workers/worker-manager.d.ts +124 -0
- package/dist/core/workers/worker-manager.js +299 -0
- package/dist/core/workers/worker-manager.js.map +1 -0
- package/dist/core/workers/worker.d.ts +1 -0
- package/dist/core/workers/worker.js +225 -0
- package/dist/core/workers/worker.js.map +1 -0
- package/dist/index.d.ts +8 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/moro.d.ts +345 -13
- package/dist/moro.js +803 -214
- package/dist/moro.js.map +1 -1
- package/dist/types/cache.d.ts +4 -0
- package/dist/types/config.d.ts +42 -0
- package/dist/types/core.d.ts +18 -1
- package/package.json +94 -20
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
// gRPC Manager - Main orchestrator for gRPC functionality
|
|
2
|
+
// Handles adapter initialization, service registration, and lifecycle management
|
|
3
|
+
import { createFrameworkLogger } from '../logger/index.js';
|
|
4
|
+
import { isPackageAvailable } from '../utilities/package-utils.js';
|
|
5
|
+
/**
|
|
6
|
+
* gRPC Manager for MoroJS
|
|
7
|
+
* Manages gRPC server lifecycle, service registration, and client creation
|
|
8
|
+
*/
|
|
9
|
+
export class GrpcManager {
|
|
10
|
+
adapter;
|
|
11
|
+
options;
|
|
12
|
+
logger = createFrameworkLogger('GRPC_MANAGER');
|
|
13
|
+
server;
|
|
14
|
+
services = new Map();
|
|
15
|
+
isInitialized = false;
|
|
16
|
+
isStarted = false;
|
|
17
|
+
constructor(options = {}) {
|
|
18
|
+
this.options = {
|
|
19
|
+
port: 50051,
|
|
20
|
+
host: '0.0.0.0',
|
|
21
|
+
adapter: 'grpc-js',
|
|
22
|
+
enableHealthCheck: true,
|
|
23
|
+
enableReflection: false,
|
|
24
|
+
maxReceiveMessageLength: 4 * 1024 * 1024, // 4MB
|
|
25
|
+
maxSendMessageLength: 4 * 1024 * 1024, // 4MB
|
|
26
|
+
compression: true,
|
|
27
|
+
...options,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Initialize gRPC manager with the specified adapter
|
|
32
|
+
*/
|
|
33
|
+
async initialize() {
|
|
34
|
+
if (this.isInitialized) {
|
|
35
|
+
this.logger.warn('gRPC manager already initialized', 'Init');
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
try {
|
|
39
|
+
// Detect and load adapter
|
|
40
|
+
const adapterName = this.options.adapter || 'grpc-js';
|
|
41
|
+
if (adapterName === 'grpc-js') {
|
|
42
|
+
await this.loadGrpcJsAdapter();
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
throw new Error(`Unknown gRPC adapter: ${adapterName}`);
|
|
46
|
+
}
|
|
47
|
+
if (!this.adapter) {
|
|
48
|
+
throw new Error('Failed to load gRPC adapter');
|
|
49
|
+
}
|
|
50
|
+
// Initialize adapter
|
|
51
|
+
await this.adapter.initialize(this.options);
|
|
52
|
+
// Enable optional features
|
|
53
|
+
if (this.options.enableHealthCheck) {
|
|
54
|
+
this.adapter.enableHealthCheck();
|
|
55
|
+
this.logger.info('Health check service enabled', 'Init');
|
|
56
|
+
}
|
|
57
|
+
if (this.options.enableReflection) {
|
|
58
|
+
this.adapter.enableReflection();
|
|
59
|
+
this.logger.info('Server reflection enabled', 'Init');
|
|
60
|
+
}
|
|
61
|
+
this.isInitialized = true;
|
|
62
|
+
this.logger.info(`gRPC manager initialized with ${adapterName} adapter`, 'Init');
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
this.logger.error(`Failed to initialize gRPC manager: ${error}`, 'Init');
|
|
66
|
+
throw error;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Register a gRPC service from a proto file
|
|
71
|
+
*/
|
|
72
|
+
async registerService(protoPath, serviceName, implementation, packageName, protoOptions) {
|
|
73
|
+
if (!this.isInitialized || !this.adapter) {
|
|
74
|
+
throw new Error('gRPC manager not initialized. Call initialize() first.');
|
|
75
|
+
}
|
|
76
|
+
try {
|
|
77
|
+
// Load proto file
|
|
78
|
+
const services = await this.adapter.loadProto(protoPath, packageName, protoOptions);
|
|
79
|
+
// Find the specified service
|
|
80
|
+
const serviceDefinition = services.find(s => s.serviceName === serviceName);
|
|
81
|
+
if (!serviceDefinition) {
|
|
82
|
+
throw new Error(`Service ${serviceName} not found in ${protoPath}. Available services: ${services.map(s => s.serviceName).join(', ')}`);
|
|
83
|
+
}
|
|
84
|
+
// Register service
|
|
85
|
+
const registration = this.adapter.addService(serviceName, serviceDefinition, implementation);
|
|
86
|
+
this.services.set(serviceName, registration);
|
|
87
|
+
this.logger.info(`Service ${serviceName} registered with ${registration.methods.length} method(s)`, 'Service');
|
|
88
|
+
return registration;
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
this.logger.error(`Failed to register service ${serviceName}: ${error}`, 'Service');
|
|
92
|
+
throw error;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Start the gRPC server
|
|
97
|
+
*/
|
|
98
|
+
async start() {
|
|
99
|
+
if (!this.isInitialized || !this.adapter) {
|
|
100
|
+
throw new Error('gRPC manager not initialized. Call initialize() first.');
|
|
101
|
+
}
|
|
102
|
+
if (this.isStarted) {
|
|
103
|
+
throw new Error('gRPC server already started');
|
|
104
|
+
}
|
|
105
|
+
try {
|
|
106
|
+
this.server = await this.adapter.start();
|
|
107
|
+
this.isStarted = true;
|
|
108
|
+
const host = this.options.host || '0.0.0.0';
|
|
109
|
+
const port = this.options.port || 50051;
|
|
110
|
+
this.logger.info(`gRPC server started on ${host}:${port}`, 'Start');
|
|
111
|
+
this.logger.info(`Registered services: ${Array.from(this.services.keys()).join(', ')}`, 'Start');
|
|
112
|
+
return this.server;
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
this.logger.error(`Failed to start gRPC server: ${error}`, 'Start');
|
|
116
|
+
throw error;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Stop the gRPC server gracefully
|
|
121
|
+
*/
|
|
122
|
+
async stop() {
|
|
123
|
+
if (!this.isStarted || !this.adapter) {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
try {
|
|
127
|
+
await this.adapter.stop();
|
|
128
|
+
this.isStarted = false;
|
|
129
|
+
this.logger.info('gRPC server stopped', 'Stop');
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
this.logger.error(`Error stopping gRPC server: ${error}`, 'Stop');
|
|
133
|
+
throw error;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Force shutdown the gRPC server
|
|
138
|
+
*/
|
|
139
|
+
forceShutdown() {
|
|
140
|
+
if (this.server) {
|
|
141
|
+
this.server.forceShutdown();
|
|
142
|
+
this.isStarted = false;
|
|
143
|
+
this.logger.warn('gRPC server force shutdown', 'Stop');
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Create a gRPC client for calling remote services
|
|
148
|
+
*/
|
|
149
|
+
async createClient(protoPath, serviceName, address, options = {}) {
|
|
150
|
+
if (!this.isInitialized || !this.adapter) {
|
|
151
|
+
throw new Error('gRPC manager not initialized. Call initialize() first.');
|
|
152
|
+
}
|
|
153
|
+
const clientOptions = {
|
|
154
|
+
address,
|
|
155
|
+
maxReceiveMessageLength: this.options.maxReceiveMessageLength,
|
|
156
|
+
maxSendMessageLength: this.options.maxSendMessageLength,
|
|
157
|
+
...options,
|
|
158
|
+
};
|
|
159
|
+
try {
|
|
160
|
+
const client = await this.adapter.createClient(protoPath, serviceName, clientOptions);
|
|
161
|
+
this.logger.info(`Created gRPC client for ${serviceName} at ${address}`, 'Client');
|
|
162
|
+
return client;
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
this.logger.error(`Failed to create gRPC client: ${error}`, 'Client');
|
|
166
|
+
throw error;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Get statistics about the gRPC server
|
|
171
|
+
*/
|
|
172
|
+
getStats() {
|
|
173
|
+
if (!this.server) {
|
|
174
|
+
return null;
|
|
175
|
+
}
|
|
176
|
+
return this.server.getStats();
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Get list of registered services
|
|
180
|
+
*/
|
|
181
|
+
getServices() {
|
|
182
|
+
return Array.from(this.services.values());
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Check if gRPC is initialized
|
|
186
|
+
*/
|
|
187
|
+
isReady() {
|
|
188
|
+
return this.isInitialized && this.isStarted;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Get the gRPC server instance
|
|
192
|
+
*/
|
|
193
|
+
getServer() {
|
|
194
|
+
return this.server;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Load @grpc/grpc-js adapter dynamically
|
|
198
|
+
*/
|
|
199
|
+
async loadGrpcJsAdapter() {
|
|
200
|
+
if (!isPackageAvailable('@grpc/grpc-js')) {
|
|
201
|
+
throw new Error('@grpc/grpc-js package not found.\n' +
|
|
202
|
+
'To use gRPC with MoroJS, install the required packages:\n' +
|
|
203
|
+
' npm install @grpc/grpc-js @grpc/proto-loader\n\n' +
|
|
204
|
+
'Then configure gRPC in your app:\n' +
|
|
205
|
+
" app.grpc({ port: 50051, adapter: 'grpc-js' });");
|
|
206
|
+
}
|
|
207
|
+
if (!isPackageAvailable('@grpc/proto-loader')) {
|
|
208
|
+
throw new Error('@grpc/proto-loader package not found.\n' +
|
|
209
|
+
'To use gRPC with MoroJS, install the required packages:\n' +
|
|
210
|
+
' npm install @grpc/grpc-js @grpc/proto-loader');
|
|
211
|
+
}
|
|
212
|
+
// Dynamic import of adapter
|
|
213
|
+
const { GrpcJsAdapter } = await import('./adapters/grpc-js-adapter.js');
|
|
214
|
+
this.adapter = new GrpcJsAdapter();
|
|
215
|
+
this.logger.info('@grpc/grpc-js adapter loaded', 'Adapter');
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=grpc-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grpc-manager.js","sourceRoot":"","sources":["../../../src/core/grpc/grpc-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { GrpcManager } from './grpc-manager.js';
|
|
2
|
+
export type { GrpcAdapter } from './grpc-adapter.js';
|
|
3
|
+
export type { GrpcOptions, GrpcCall, GrpcCallback, GrpcMetadata, GrpcError, GrpcStatusCode, GrpcCredentials, GrpcServer, GrpcClient, GrpcClientOptions, GrpcInterceptor, ServiceImplementation, ServiceDefinition, ServiceRegistration, MethodDefinition, UnaryHandler, ServerStreamingHandler, ClientStreamingHandler, BidirectionalStreamingHandler, GrpcHandler, GrpcStats, HealthCheckStatus, HealthCheckResponse, ProtoLoadOptions, } from './types.js';
|
|
4
|
+
export { GrpcJsAdapter } from './adapters/index.js';
|
|
5
|
+
export { grpcAuth, grpcRequirePermission, grpcRequireRole, extractTokenFromMetadata, } from './middleware/auth.js';
|
|
6
|
+
export { grpcLogger, grpcSimpleLogger, grpcDetailedLogger } from './middleware/logging.js';
|
|
7
|
+
export { grpcValidate, grpcValidateHandler } from './middleware/validation.js';
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// gRPC Module - Public API
|
|
2
|
+
// Central export point for gRPC functionality in MoroJS
|
|
3
|
+
export { GrpcManager } from './grpc-manager.js';
|
|
4
|
+
// Export adapters
|
|
5
|
+
export { GrpcJsAdapter } from './adapters/index.js';
|
|
6
|
+
// Export middleware
|
|
7
|
+
export { grpcAuth, grpcRequirePermission, grpcRequireRole, extractTokenFromMetadata, } from './middleware/auth.js';
|
|
8
|
+
export { grpcLogger, grpcSimpleLogger, grpcDetailedLogger } from './middleware/logging.js';
|
|
9
|
+
export { grpcValidate, grpcValidateHandler } from './middleware/validation.js';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/grpc/index.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,wDAAwD;AAExD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AA+BhD,kBAAkB;AAClB,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,oBAAoB;AACpB,OAAO,EACL,QAAQ,EACR,qBAAqB,EACrB,eAAe,EACf,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE3F,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { GrpcCall, GrpcCallback, GrpcMetadata } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Extract JWT token from gRPC metadata
|
|
4
|
+
*/
|
|
5
|
+
export declare function extractTokenFromMetadata(metadata: GrpcMetadata): string | null;
|
|
6
|
+
/**
|
|
7
|
+
* gRPC authentication middleware
|
|
8
|
+
* Verifies JWT tokens from gRPC metadata
|
|
9
|
+
*/
|
|
10
|
+
export declare function grpcAuth(options: {
|
|
11
|
+
secret?: string;
|
|
12
|
+
verify?: (token: string) => Promise<any>;
|
|
13
|
+
required?: boolean;
|
|
14
|
+
}): (call: GrpcCall, callback?: GrpcCallback) => Promise<void>;
|
|
15
|
+
/**
|
|
16
|
+
* gRPC permission check middleware
|
|
17
|
+
*/
|
|
18
|
+
export declare function grpcRequirePermission(permission: string | string[]): (call: GrpcCall, callback?: GrpcCallback) => Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* gRPC role check middleware
|
|
21
|
+
*/
|
|
22
|
+
export declare function grpcRequireRole(role: string | string[]): (call: GrpcCall, callback?: GrpcCallback) => Promise<void>;
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
// gRPC Middleware - Auth Integration
|
|
2
|
+
// Integrate Moro's authentication system with gRPC
|
|
3
|
+
import { createFrameworkLogger } from '../../logger/index.js';
|
|
4
|
+
const logger = createFrameworkLogger('GRPC_AUTH');
|
|
5
|
+
/**
|
|
6
|
+
* Extract JWT token from gRPC metadata
|
|
7
|
+
*/
|
|
8
|
+
export function extractTokenFromMetadata(metadata) {
|
|
9
|
+
if (!metadata)
|
|
10
|
+
return null;
|
|
11
|
+
// Try to get authorization header
|
|
12
|
+
const authHeader = metadata.get('authorization');
|
|
13
|
+
if (!authHeader)
|
|
14
|
+
return null;
|
|
15
|
+
const authValue = Array.isArray(authHeader) ? authHeader[0] : authHeader;
|
|
16
|
+
if (typeof authValue === 'string') {
|
|
17
|
+
// Extract Bearer token
|
|
18
|
+
const match = authValue.match(/^Bearer\s+(\S+)$/i);
|
|
19
|
+
return match ? match[1] : null;
|
|
20
|
+
}
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* gRPC authentication middleware
|
|
25
|
+
* Verifies JWT tokens from gRPC metadata
|
|
26
|
+
*/
|
|
27
|
+
export function grpcAuth(options) {
|
|
28
|
+
return async (call, callback) => {
|
|
29
|
+
try {
|
|
30
|
+
const token = extractTokenFromMetadata(call.metadata);
|
|
31
|
+
if (!token) {
|
|
32
|
+
if (options.required !== false) {
|
|
33
|
+
const error = new Error('Unauthenticated: No token provided');
|
|
34
|
+
error.code = 16; // UNAUTHENTICATED
|
|
35
|
+
throw error;
|
|
36
|
+
}
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
// Verify token
|
|
40
|
+
let user;
|
|
41
|
+
if (options.verify) {
|
|
42
|
+
user = await options.verify(token);
|
|
43
|
+
}
|
|
44
|
+
else if (options.secret) {
|
|
45
|
+
// Simple JWT verification (requires jsonwebtoken package)
|
|
46
|
+
// This is a placeholder - full implementation would use jwt library
|
|
47
|
+
logger.warn('Token verification not fully implemented', 'Auth');
|
|
48
|
+
user = { token };
|
|
49
|
+
}
|
|
50
|
+
// Attach user to call context
|
|
51
|
+
if (!call.request) {
|
|
52
|
+
call.request = {};
|
|
53
|
+
}
|
|
54
|
+
call.user = user;
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
logger.error(`Authentication error: ${error}`, 'Auth');
|
|
58
|
+
const grpcError = new Error(error instanceof Error ? error.message : 'Authentication failed');
|
|
59
|
+
grpcError.code = 16; // UNAUTHENTICATED
|
|
60
|
+
if (callback) {
|
|
61
|
+
callback(grpcError);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
throw grpcError;
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* gRPC permission check middleware
|
|
70
|
+
*/
|
|
71
|
+
export function grpcRequirePermission(permission) {
|
|
72
|
+
return async (call, callback) => {
|
|
73
|
+
const user = call.user;
|
|
74
|
+
if (!user) {
|
|
75
|
+
const error = new Error('Unauthenticated: User not found in call context');
|
|
76
|
+
error.code = 16; // UNAUTHENTICATED
|
|
77
|
+
if (callback) {
|
|
78
|
+
callback(error);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
throw error;
|
|
82
|
+
}
|
|
83
|
+
const requiredPermissions = Array.isArray(permission) ? permission : [permission];
|
|
84
|
+
const userPermissions = user.permissions || [];
|
|
85
|
+
const hasPermission = requiredPermissions.some((perm) => userPermissions.includes(perm));
|
|
86
|
+
if (!hasPermission) {
|
|
87
|
+
const error = new Error(`Permission denied: Required ${requiredPermissions.join(' or ')}`);
|
|
88
|
+
error.code = 7; // PERMISSION_DENIED
|
|
89
|
+
if (callback) {
|
|
90
|
+
callback(error);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
throw error;
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* gRPC role check middleware
|
|
99
|
+
*/
|
|
100
|
+
export function grpcRequireRole(role) {
|
|
101
|
+
return async (call, callback) => {
|
|
102
|
+
const user = call.user;
|
|
103
|
+
if (!user) {
|
|
104
|
+
const error = new Error('Unauthenticated: User not found in call context');
|
|
105
|
+
error.code = 16; // UNAUTHENTICATED
|
|
106
|
+
if (callback) {
|
|
107
|
+
callback(error);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
throw error;
|
|
111
|
+
}
|
|
112
|
+
const requiredRoles = Array.isArray(role) ? role : [role];
|
|
113
|
+
const userRoles = user.roles || [user.role];
|
|
114
|
+
const hasRole = requiredRoles.some((r) => userRoles.includes(r));
|
|
115
|
+
if (!hasRole) {
|
|
116
|
+
const error = new Error(`Permission denied: Required role ${requiredRoles.join(' or ')}`);
|
|
117
|
+
error.code = 7; // PERMISSION_DENIED
|
|
118
|
+
if (callback) {
|
|
119
|
+
callback(error);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
throw error;
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../../src/core/grpc/middleware/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { GrpcCall, GrpcCallback } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* gRPC request logging middleware
|
|
4
|
+
* Logs all gRPC calls with timing and status
|
|
5
|
+
*/
|
|
6
|
+
export declare function grpcLogger(options?: {
|
|
7
|
+
logger?: any;
|
|
8
|
+
logMetadata?: boolean;
|
|
9
|
+
logRequest?: boolean;
|
|
10
|
+
logResponse?: boolean;
|
|
11
|
+
}): (call: GrpcCall, callback?: GrpcCallback, next?: CallableFunction) => Promise<void>;
|
|
12
|
+
/**
|
|
13
|
+
* Simple request logger that just logs method and timing
|
|
14
|
+
*/
|
|
15
|
+
export declare function grpcSimpleLogger(): (call: GrpcCall, callback?: GrpcCallback, next?: CallableFunction) => Promise<void>;
|
|
16
|
+
/**
|
|
17
|
+
* Detailed request logger that logs everything
|
|
18
|
+
*/
|
|
19
|
+
export declare function grpcDetailedLogger(): (call: GrpcCall, callback?: GrpcCallback, next?: CallableFunction) => Promise<void>;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
// gRPC Middleware - Logging Integration
|
|
2
|
+
// Integrate Moro's logging system with gRPC
|
|
3
|
+
import { createFrameworkLogger } from '../../logger/index.js';
|
|
4
|
+
/**
|
|
5
|
+
* gRPC request logging middleware
|
|
6
|
+
* Logs all gRPC calls with timing and status
|
|
7
|
+
*/
|
|
8
|
+
export function grpcLogger(options = {}) {
|
|
9
|
+
const logger = options.logger || createFrameworkLogger('GRPC_REQUEST');
|
|
10
|
+
return async (call, callback, next) => {
|
|
11
|
+
const startTime = Date.now();
|
|
12
|
+
const peer = call.getPeer?.() || 'unknown';
|
|
13
|
+
const methodPath = call.methodPath || 'unknown';
|
|
14
|
+
// Log request
|
|
15
|
+
logger.info(`→ gRPC call: ${methodPath} from ${peer}`, 'Request');
|
|
16
|
+
if (options.logMetadata && call.metadata) {
|
|
17
|
+
logger.debug(`Metadata: ${JSON.stringify(call.metadata.getMap())}`, 'Request');
|
|
18
|
+
}
|
|
19
|
+
if (options.logRequest && call.request) {
|
|
20
|
+
logger.debug(`Request: ${JSON.stringify(call.request)}`, 'Request');
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
// Execute handler
|
|
24
|
+
if (next) {
|
|
25
|
+
await next(call, callback);
|
|
26
|
+
}
|
|
27
|
+
const duration = Date.now() - startTime;
|
|
28
|
+
logger.info(`✓ gRPC call completed: ${methodPath} in ${duration}ms`, 'Response');
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
const duration = Date.now() - startTime;
|
|
32
|
+
logger.error(`✗ gRPC call failed: ${methodPath} in ${duration}ms - ${error}`, 'Response');
|
|
33
|
+
throw error;
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Simple request logger that just logs method and timing
|
|
39
|
+
*/
|
|
40
|
+
export function grpcSimpleLogger() {
|
|
41
|
+
return grpcLogger({
|
|
42
|
+
logMetadata: false,
|
|
43
|
+
logRequest: false,
|
|
44
|
+
logResponse: false,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Detailed request logger that logs everything
|
|
49
|
+
*/
|
|
50
|
+
export function grpcDetailedLogger() {
|
|
51
|
+
return grpcLogger({
|
|
52
|
+
logMetadata: true,
|
|
53
|
+
logRequest: true,
|
|
54
|
+
logResponse: true,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=logging.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logging.js","sourceRoot":"","sources":["../../../../src/core/grpc/middleware/logging.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,4CAA4C;AAG5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAE9D;;;GAGG;AACH,MAAM,UAAU,UAAU,CACxB,UAKI,EAAE;IAEN,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,qBAAqB,CAAC,cAAc,CAAC,CAAC;IAEvE,OAAO,KAAK,EAAE,IAAc,EAAE,QAAuB,EAAE,IAAuB,EAAE,EAAE;QAChF,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,SAAS,CAAC;QAC3C,MAAM,UAAU,GAAI,IAAY,CAAC,UAAU,IAAI,SAAS,CAAC;QAEzD,cAAc;QACd,MAAM,CAAC,IAAI,CAAC,gBAAgB,UAAU,SAAS,IAAI,EAAE,EAAE,SAAS,CAAC,CAAC;QAElE,IAAI,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACzC,MAAM,CAAC,KAAK,CAAC,aAAa,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QACjF,CAAC;QAED,IAAI,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACvC,MAAM,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QACtE,CAAC;QAED,IAAI,CAAC;YACH,kBAAkB;YAClB,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC7B,CAAC;YAED,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,0BAA0B,UAAU,OAAO,QAAQ,IAAI,EAAE,UAAU,CAAC,CAAC;QACnF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YACxC,MAAM,CAAC,KAAK,CAAC,uBAAuB,UAAU,OAAO,QAAQ,QAAQ,KAAK,EAAE,EAAE,UAAU,CAAC,CAAC;YAC1F,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,UAAU,CAAC;QAChB,WAAW,EAAE,KAAK;QAClB,UAAU,EAAE,KAAK;QACjB,WAAW,EAAE,KAAK;KACnB,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO,UAAU,CAAC;QAChB,WAAW,EAAE,IAAI;QACjB,UAAU,EAAE,IAAI;QAChB,WAAW,EAAE,IAAI;KAClB,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { GrpcCall, GrpcCallback } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* gRPC request validation middleware
|
|
4
|
+
* Validates incoming gRPC requests using Zod, Joi, Yup, or any validation library
|
|
5
|
+
*/
|
|
6
|
+
export declare function grpcValidate(options: {
|
|
7
|
+
request?: any;
|
|
8
|
+
response?: any;
|
|
9
|
+
stripUnknown?: boolean;
|
|
10
|
+
}): (call: GrpcCall, callback?: GrpcCallback) => Promise<void>;
|
|
11
|
+
/**
|
|
12
|
+
* Wrap a handler to validate both request and response
|
|
13
|
+
*/
|
|
14
|
+
export declare function grpcValidateHandler<TRequest = any, TResponse = any>(handler: (call: GrpcCall<TRequest>, callback: GrpcCallback<TResponse>) => void | Promise<void>, options: {
|
|
15
|
+
request?: any;
|
|
16
|
+
response?: any;
|
|
17
|
+
stripUnknown?: boolean;
|
|
18
|
+
}): (call: GrpcCall<TRequest>, callback: GrpcCallback<TResponse>) => Promise<void>;
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
// gRPC Middleware - Validation Integration
|
|
2
|
+
// Integrate Moro's validation system with gRPC
|
|
3
|
+
import { normalizeValidationError } from '../../validation/schema-interface.js';
|
|
4
|
+
import { createFrameworkLogger } from '../../logger/index.js';
|
|
5
|
+
const logger = createFrameworkLogger('GRPC_VALIDATION');
|
|
6
|
+
/**
|
|
7
|
+
* gRPC request validation middleware
|
|
8
|
+
* Validates incoming gRPC requests using Zod, Joi, Yup, or any validation library
|
|
9
|
+
*/
|
|
10
|
+
export function grpcValidate(options) {
|
|
11
|
+
return async (call, callback) => {
|
|
12
|
+
try {
|
|
13
|
+
// Validate request
|
|
14
|
+
if (options.request && call.request) {
|
|
15
|
+
try {
|
|
16
|
+
// Try to validate with the schema
|
|
17
|
+
if (typeof options.request.parse === 'function') {
|
|
18
|
+
// Zod-like schema
|
|
19
|
+
call.request = options.request.parse(call.request);
|
|
20
|
+
}
|
|
21
|
+
else if (typeof options.request.validate === 'function') {
|
|
22
|
+
// Joi-like schema
|
|
23
|
+
const result = options.request.validate(call.request, {
|
|
24
|
+
stripUnknown: options.stripUnknown,
|
|
25
|
+
});
|
|
26
|
+
if (result.error) {
|
|
27
|
+
throw result.error;
|
|
28
|
+
}
|
|
29
|
+
call.request = result.value;
|
|
30
|
+
}
|
|
31
|
+
else if (typeof options.request.validateSync === 'function') {
|
|
32
|
+
// Yup-like schema
|
|
33
|
+
call.request = options.request.validateSync(call.request, {
|
|
34
|
+
stripUnknown: options.stripUnknown,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
const normalizedError = normalizeValidationError(error);
|
|
40
|
+
logger.error(`Request validation failed: ${normalizedError.message}`, 'Validation');
|
|
41
|
+
const grpcError = new Error(`Invalid request: ${normalizedError.message}`);
|
|
42
|
+
grpcError.code = 3; // INVALID_ARGUMENT
|
|
43
|
+
grpcError.details = normalizedError.errors || normalizedError.message;
|
|
44
|
+
if (callback) {
|
|
45
|
+
callback(grpcError);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
throw grpcError;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// Note: Response validation would happen in a wrapper around the handler
|
|
52
|
+
// since we need to intercept the response before it's sent
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
logger.error(`Validation error: ${error}`, 'Validation');
|
|
56
|
+
if (callback) {
|
|
57
|
+
callback(error);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
throw error;
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Wrap a handler to validate both request and response
|
|
66
|
+
*/
|
|
67
|
+
export function grpcValidateHandler(handler, options) {
|
|
68
|
+
return async (call, callback) => {
|
|
69
|
+
// Validate request
|
|
70
|
+
if (options.request) {
|
|
71
|
+
const validator = grpcValidate({
|
|
72
|
+
request: options.request,
|
|
73
|
+
stripUnknown: options.stripUnknown,
|
|
74
|
+
});
|
|
75
|
+
await validator(call, callback);
|
|
76
|
+
}
|
|
77
|
+
// Wrap callback to validate response
|
|
78
|
+
const wrappedCallback = (error, response) => {
|
|
79
|
+
if (error || !response) {
|
|
80
|
+
callback(error, response);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
// Validate response
|
|
84
|
+
if (options.response) {
|
|
85
|
+
try {
|
|
86
|
+
let validatedResponse = response;
|
|
87
|
+
if (typeof options.response.parse === 'function') {
|
|
88
|
+
// Zod-like schema
|
|
89
|
+
validatedResponse = options.response.parse(response);
|
|
90
|
+
}
|
|
91
|
+
else if (typeof options.response.validate === 'function') {
|
|
92
|
+
// Joi-like schema
|
|
93
|
+
const result = options.response.validate(response, {
|
|
94
|
+
stripUnknown: options.stripUnknown,
|
|
95
|
+
});
|
|
96
|
+
if (result.error) {
|
|
97
|
+
throw result.error;
|
|
98
|
+
}
|
|
99
|
+
validatedResponse = result.value;
|
|
100
|
+
}
|
|
101
|
+
else if (typeof options.response.validateSync === 'function') {
|
|
102
|
+
// Yup-like schema
|
|
103
|
+
validatedResponse = options.response.validateSync(response, {
|
|
104
|
+
stripUnknown: options.stripUnknown,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
callback(null, validatedResponse);
|
|
108
|
+
}
|
|
109
|
+
catch (validationError) {
|
|
110
|
+
const normalizedError = normalizeValidationError(validationError);
|
|
111
|
+
logger.error(`Response validation failed: ${normalizedError.message}`, 'Validation');
|
|
112
|
+
const grpcError = new Error(`Invalid response: ${normalizedError.message}`);
|
|
113
|
+
grpcError.code = 13; // INTERNAL
|
|
114
|
+
grpcError.details = normalizedError.errors || normalizedError.message;
|
|
115
|
+
callback(grpcError);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
callback(null, response);
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
// Execute handler
|
|
123
|
+
await handler(call, wrappedCallback);
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../../src/core/grpc/middleware/validation.ts"],"names":[],"mappings":"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"}
|