From dc1901f39950394bf82ed61d371abcef7b60e44d Mon Sep 17 00:00:00 2001 From: obrucheoghene Date: Wed, 13 Aug 2025 15:17:52 +0100 Subject: [PATCH] implement grpc services --- src/app.ts | 2 + src/config/index.ts | 2 +- src/protos/media-signaling.proto | 25 ++----- src/protos/media-signaling.ts | 40 +++------- .../HealthCheckRequest.ts | 10 --- .../HealthCheckResponse.ts | 31 -------- .../MediaSignalingService.ts | 73 ------------------ .../HealthCheckRequest.ts | 10 --- .../HealthCheckResponse.ts | 31 -------- .../media_signaling_package/MediaSignaling.ts | 75 ++++--------------- .../SendMessageRequest.ts | 12 +++ .../SendMessageResponse.ts | 12 +++ src/servers/grpc-server.ts | 40 +++++----- 13 files changed, 79 insertions(+), 284 deletions(-) delete mode 100644 src/protos/mediaSignalingPackage/HealthCheckRequest.ts delete mode 100644 src/protos/mediaSignalingPackage/HealthCheckResponse.ts delete mode 100644 src/protos/mediaSignalingPackage/MediaSignalingService.ts delete mode 100644 src/protos/media_signaling_package/HealthCheckRequest.ts delete mode 100644 src/protos/media_signaling_package/HealthCheckResponse.ts create mode 100644 src/protos/media_signaling_package/SendMessageRequest.ts create mode 100644 src/protos/media_signaling_package/SendMessageResponse.ts diff --git a/src/app.ts b/src/app.ts index ddc7171..33d917c 100644 --- a/src/app.ts +++ b/src/app.ts @@ -7,6 +7,7 @@ import { createServer } from 'https'; import config from './config'; import { Routes } from './routes'; import { redisServer } from './servers/redis-server'; +import { grpcServer } from './servers/grpc-server'; const serverOption = { key: fs.readFileSync(config.tls.key, 'utf8'), @@ -27,6 +28,7 @@ const httpsServer = createServer(serverOption, app); httpsServer.listen(config.port, () => { console.log(`Server running on port ${config.port}`); }); + await grpcServer.start(); } catch (error) { console.error('Initialization error:', error); process.exit(1); diff --git a/src/config/index.ts b/src/config/index.ts index 4fd1ef4..d2913a1 100644 --- a/src/config/index.ts +++ b/src/config/index.ts @@ -16,7 +16,7 @@ const config = { cert: process.env.HTTPS_CERT || certPath, key: process.env.HTTPS_KEY || keyPath, }, - port: process.env.PORT || 8000, + port: process.env.PORT || 4000, apiServerUrl: process.env.API_SERVER_URL, apiServerApiKey: process.env.API_SERVER_API_KEY, recordingServerUrl: process.env.RECORDING_SERVER_URL, diff --git a/src/protos/media-signaling.proto b/src/protos/media-signaling.proto index caaa49f..83160de 100644 --- a/src/protos/media-signaling.proto +++ b/src/protos/media-signaling.proto @@ -1,25 +1,16 @@ syntax = "proto3"; - package media_signaling_package; -// Service definition for bidirectional communication service MediaSignaling { - // Health check - rpc HealthCheck(HealthCheckRequest) returns (HealthCheckResponse); + rpc SendMessage(stream SendMessageRequest) returns (stream SendMessageResponse) {}; } - - -// Health check messages -message HealthCheckRequest { - string service = 1; +message SendMessageRequest { + string type = 1; + map args = 2; } -message HealthCheckResponse { - enum ServingStatus { - UNKNOWN = 0; - SERVING = 1; - NOT_SERVING = 2; - SERVICE_UNKNOWN = 3; - } - ServingStatus status = 1; +message SendMessageResponse { + string type = 1; + map args = 2; } + diff --git a/src/protos/media-signaling.ts b/src/protos/media-signaling.ts index 1b83f00..b4f09b7 100644 --- a/src/protos/media-signaling.ts +++ b/src/protos/media-signaling.ts @@ -1,39 +1,19 @@ import type * as grpc from '@grpc/grpc-js'; import type { MessageTypeDefinition } from '@grpc/proto-loader'; -import type { - HealthCheckRequest as _media_signaling_package_HealthCheckRequest, - HealthCheckRequest__Output as _media_signaling_package_HealthCheckRequest__Output, -} from './media_signaling_package/HealthCheckRequest'; -import type { - HealthCheckResponse as _media_signaling_package_HealthCheckResponse, - HealthCheckResponse__Output as _media_signaling_package_HealthCheckResponse__Output, -} from './media_signaling_package/HealthCheckResponse'; -import type { - MediaSignalingClient as _media_signaling_package_MediaSignalingClient, - MediaSignalingDefinition as _media_signaling_package_MediaSignalingDefinition, -} from './media_signaling_package/MediaSignaling'; +import type { MediaSignalingClient as _media_signaling_package_MediaSignalingClient, MediaSignalingDefinition as _media_signaling_package_MediaSignalingDefinition } from './media_signaling_package/MediaSignaling'; +import type { SendMessageRequest as _media_signaling_package_SendMessageRequest, SendMessageRequest__Output as _media_signaling_package_SendMessageRequest__Output } from './media_signaling_package/SendMessageRequest'; +import type { SendMessageResponse as _media_signaling_package_SendMessageResponse, SendMessageResponse__Output as _media_signaling_package_SendMessageResponse__Output } from './media_signaling_package/SendMessageResponse'; -type SubtypeConstructor< - Constructor extends new (...args: any) => any, - Subtype, -> = { - new (...args: ConstructorParameters): Subtype; +type SubtypeConstructor any, Subtype> = { + new(...args: ConstructorParameters): Subtype; }; export interface ProtoGrpcType { media_signaling_package: { - HealthCheckRequest: MessageTypeDefinition< - _media_signaling_package_HealthCheckRequest, - _media_signaling_package_HealthCheckRequest__Output - >; - HealthCheckResponse: MessageTypeDefinition< - _media_signaling_package_HealthCheckResponse, - _media_signaling_package_HealthCheckResponse__Output - >; - MediaSignaling: SubtypeConstructor< - typeof grpc.Client, - _media_signaling_package_MediaSignalingClient - > & { service: _media_signaling_package_MediaSignalingDefinition }; - }; + MediaSignaling: SubtypeConstructor & { service: _media_signaling_package_MediaSignalingDefinition } + SendMessageRequest: MessageTypeDefinition<_media_signaling_package_SendMessageRequest, _media_signaling_package_SendMessageRequest__Output> + SendMessageResponse: MessageTypeDefinition<_media_signaling_package_SendMessageResponse, _media_signaling_package_SendMessageResponse__Output> + } } + diff --git a/src/protos/mediaSignalingPackage/HealthCheckRequest.ts b/src/protos/mediaSignalingPackage/HealthCheckRequest.ts deleted file mode 100644 index 68b9d0b..0000000 --- a/src/protos/mediaSignalingPackage/HealthCheckRequest.ts +++ /dev/null @@ -1,10 +0,0 @@ -// Original file: src/protos/media-signaling.proto - - -export interface HealthCheckRequest { - 'service'?: (string); -} - -export interface HealthCheckRequest__Output { - 'service'?: (string); -} diff --git a/src/protos/mediaSignalingPackage/HealthCheckResponse.ts b/src/protos/mediaSignalingPackage/HealthCheckResponse.ts deleted file mode 100644 index e8bf0b1..0000000 --- a/src/protos/mediaSignalingPackage/HealthCheckResponse.ts +++ /dev/null @@ -1,31 +0,0 @@ -// Original file: src/protos/media-signaling.proto - - -// Original file: src/protos/media-signaling.proto - -export const _mediaSignalingPackage_HealthCheckResponse_ServingStatus = { - UNKNOWN: 0, - SERVING: 1, - NOT_SERVING: 2, - SERVICE_UNKNOWN: 3, -} as const; - -export type _mediaSignalingPackage_HealthCheckResponse_ServingStatus = - | 'UNKNOWN' - | 0 - | 'SERVING' - | 1 - | 'NOT_SERVING' - | 2 - | 'SERVICE_UNKNOWN' - | 3 - -export type _mediaSignalingPackage_HealthCheckResponse_ServingStatus__Output = typeof _mediaSignalingPackage_HealthCheckResponse_ServingStatus[keyof typeof _mediaSignalingPackage_HealthCheckResponse_ServingStatus] - -export interface HealthCheckResponse { - 'status'?: (_mediaSignalingPackage_HealthCheckResponse_ServingStatus); -} - -export interface HealthCheckResponse__Output { - 'status'?: (_mediaSignalingPackage_HealthCheckResponse_ServingStatus__Output); -} diff --git a/src/protos/mediaSignalingPackage/MediaSignalingService.ts b/src/protos/mediaSignalingPackage/MediaSignalingService.ts deleted file mode 100644 index adffbea..0000000 --- a/src/protos/mediaSignalingPackage/MediaSignalingService.ts +++ /dev/null @@ -1,73 +0,0 @@ -// Original file: src/protos/media-signaling.proto - -import type * as grpc from '@grpc/grpc-js'; -import type { MethodDefinition } from '@grpc/proto-loader'; -import type { - HealthCheckRequest as _mediaSignalingPackage_HealthCheckRequest, - HealthCheckRequest__Output as _mediaSignalingPackage_HealthCheckRequest__Output, -} from './HealthCheckRequest'; -import type { - HealthCheckResponse as _mediaSignalingPackage_HealthCheckResponse, - HealthCheckResponse__Output as _mediaSignalingPackage_HealthCheckResponse__Output, -} from './HealthCheckResponse'; - -export interface MediaSignalingServiceClient extends grpc.Client { - HealthCheck( - argument: _mediaSignalingPackage_HealthCheckRequest, - metadata: grpc.Metadata, - options: grpc.CallOptions, - callback: grpc.requestCallback<_mediaSignalingPackage_HealthCheckResponse__Output> - ): grpc.ClientUnaryCall; - HealthCheck( - argument: _mediaSignalingPackage_HealthCheckRequest, - metadata: grpc.Metadata, - callback: grpc.requestCallback<_mediaSignalingPackage_HealthCheckResponse__Output> - ): grpc.ClientUnaryCall; - HealthCheck( - argument: _mediaSignalingPackage_HealthCheckRequest, - options: grpc.CallOptions, - callback: grpc.requestCallback<_mediaSignalingPackage_HealthCheckResponse__Output> - ): grpc.ClientUnaryCall; - HealthCheck( - argument: _mediaSignalingPackage_HealthCheckRequest, - callback: grpc.requestCallback<_mediaSignalingPackage_HealthCheckResponse__Output> - ): grpc.ClientUnaryCall; - healthCheck( - argument: _mediaSignalingPackage_HealthCheckRequest, - metadata: grpc.Metadata, - options: grpc.CallOptions, - callback: grpc.requestCallback<_mediaSignalingPackage_HealthCheckResponse__Output> - ): grpc.ClientUnaryCall; - healthCheck( - argument: _mediaSignalingPackage_HealthCheckRequest, - metadata: grpc.Metadata, - callback: grpc.requestCallback<_mediaSignalingPackage_HealthCheckResponse__Output> - ): grpc.ClientUnaryCall; - healthCheck( - argument: _mediaSignalingPackage_HealthCheckRequest, - options: grpc.CallOptions, - callback: grpc.requestCallback<_mediaSignalingPackage_HealthCheckResponse__Output> - ): grpc.ClientUnaryCall; - healthCheck( - argument: _mediaSignalingPackage_HealthCheckRequest, - callback: grpc.requestCallback<_mediaSignalingPackage_HealthCheckResponse__Output> - ): grpc.ClientUnaryCall; -} - -export interface MediaSignalingServiceHandlers - extends grpc.UntypedServiceImplementation { - HealthCheck: grpc.handleUnaryCall< - _mediaSignalingPackage_HealthCheckRequest__Output, - _mediaSignalingPackage_HealthCheckResponse - >; -} - -export interface MediaSignalingServiceDefinition - extends grpc.ServiceDefinition { - HealthCheck: MethodDefinition< - _mediaSignalingPackage_HealthCheckRequest, - _mediaSignalingPackage_HealthCheckResponse, - _mediaSignalingPackage_HealthCheckRequest__Output, - _mediaSignalingPackage_HealthCheckResponse__Output - >; -} diff --git a/src/protos/media_signaling_package/HealthCheckRequest.ts b/src/protos/media_signaling_package/HealthCheckRequest.ts deleted file mode 100644 index 68b9d0b..0000000 --- a/src/protos/media_signaling_package/HealthCheckRequest.ts +++ /dev/null @@ -1,10 +0,0 @@ -// Original file: src/protos/media-signaling.proto - - -export interface HealthCheckRequest { - 'service'?: (string); -} - -export interface HealthCheckRequest__Output { - 'service'?: (string); -} diff --git a/src/protos/media_signaling_package/HealthCheckResponse.ts b/src/protos/media_signaling_package/HealthCheckResponse.ts deleted file mode 100644 index c89f8b0..0000000 --- a/src/protos/media_signaling_package/HealthCheckResponse.ts +++ /dev/null @@ -1,31 +0,0 @@ -// Original file: src/protos/media-signaling.proto - - -// Original file: src/protos/media-signaling.proto - -export const _media_signaling_package_HealthCheckResponse_ServingStatus = { - UNKNOWN: 0, - SERVING: 1, - NOT_SERVING: 2, - SERVICE_UNKNOWN: 3, -} as const; - -export type _media_signaling_package_HealthCheckResponse_ServingStatus = - | 'UNKNOWN' - | 0 - | 'SERVING' - | 1 - | 'NOT_SERVING' - | 2 - | 'SERVICE_UNKNOWN' - | 3 - -export type _media_signaling_package_HealthCheckResponse_ServingStatus__Output = typeof _media_signaling_package_HealthCheckResponse_ServingStatus[keyof typeof _media_signaling_package_HealthCheckResponse_ServingStatus] - -export interface HealthCheckResponse { - 'status'?: (_media_signaling_package_HealthCheckResponse_ServingStatus); -} - -export interface HealthCheckResponse__Output { - 'status'?: (_media_signaling_package_HealthCheckResponse_ServingStatus__Output); -} diff --git a/src/protos/media_signaling_package/MediaSignaling.ts b/src/protos/media_signaling_package/MediaSignaling.ts index c68fc3e..05b30dc 100644 --- a/src/protos/media_signaling_package/MediaSignaling.ts +++ b/src/protos/media_signaling_package/MediaSignaling.ts @@ -1,72 +1,23 @@ // Original file: src/protos/media-signaling.proto -import type * as grpc from '@grpc/grpc-js'; -import type { MethodDefinition } from '@grpc/proto-loader'; -import type { - HealthCheckRequest as _media_signaling_package_HealthCheckRequest, - HealthCheckRequest__Output as _media_signaling_package_HealthCheckRequest__Output, -} from './HealthCheckRequest'; -import type { - HealthCheckResponse as _media_signaling_package_HealthCheckResponse, - HealthCheckResponse__Output as _media_signaling_package_HealthCheckResponse__Output, -} from './HealthCheckResponse'; +import type * as grpc from '@grpc/grpc-js' +import type { MethodDefinition } from '@grpc/proto-loader' +import type { SendMessageRequest as _media_signaling_package_SendMessageRequest, SendMessageRequest__Output as _media_signaling_package_SendMessageRequest__Output } from '../media_signaling_package/SendMessageRequest'; +import type { SendMessageResponse as _media_signaling_package_SendMessageResponse, SendMessageResponse__Output as _media_signaling_package_SendMessageResponse__Output } from '../media_signaling_package/SendMessageResponse'; export interface MediaSignalingClient extends grpc.Client { - HealthCheck( - argument: _media_signaling_package_HealthCheckRequest, - metadata: grpc.Metadata, - options: grpc.CallOptions, - callback: grpc.requestCallback<_media_signaling_package_HealthCheckResponse__Output> - ): grpc.ClientUnaryCall; - HealthCheck( - argument: _media_signaling_package_HealthCheckRequest, - metadata: grpc.Metadata, - callback: grpc.requestCallback<_media_signaling_package_HealthCheckResponse__Output> - ): grpc.ClientUnaryCall; - HealthCheck( - argument: _media_signaling_package_HealthCheckRequest, - options: grpc.CallOptions, - callback: grpc.requestCallback<_media_signaling_package_HealthCheckResponse__Output> - ): grpc.ClientUnaryCall; - HealthCheck( - argument: _media_signaling_package_HealthCheckRequest, - callback: grpc.requestCallback<_media_signaling_package_HealthCheckResponse__Output> - ): grpc.ClientUnaryCall; - healthCheck( - argument: _media_signaling_package_HealthCheckRequest, - metadata: grpc.Metadata, - options: grpc.CallOptions, - callback: grpc.requestCallback<_media_signaling_package_HealthCheckResponse__Output> - ): grpc.ClientUnaryCall; - healthCheck( - argument: _media_signaling_package_HealthCheckRequest, - metadata: grpc.Metadata, - callback: grpc.requestCallback<_media_signaling_package_HealthCheckResponse__Output> - ): grpc.ClientUnaryCall; - healthCheck( - argument: _media_signaling_package_HealthCheckRequest, - options: grpc.CallOptions, - callback: grpc.requestCallback<_media_signaling_package_HealthCheckResponse__Output> - ): grpc.ClientUnaryCall; - healthCheck( - argument: _media_signaling_package_HealthCheckRequest, - callback: grpc.requestCallback<_media_signaling_package_HealthCheckResponse__Output> - ): grpc.ClientUnaryCall; + SendMessage(metadata: grpc.Metadata, options?: grpc.CallOptions): grpc.ClientDuplexStream<_media_signaling_package_SendMessageRequest, _media_signaling_package_SendMessageResponse__Output>; + SendMessage(options?: grpc.CallOptions): grpc.ClientDuplexStream<_media_signaling_package_SendMessageRequest, _media_signaling_package_SendMessageResponse__Output>; + sendMessage(metadata: grpc.Metadata, options?: grpc.CallOptions): grpc.ClientDuplexStream<_media_signaling_package_SendMessageRequest, _media_signaling_package_SendMessageResponse__Output>; + sendMessage(options?: grpc.CallOptions): grpc.ClientDuplexStream<_media_signaling_package_SendMessageRequest, _media_signaling_package_SendMessageResponse__Output>; + } -export interface MediaSignalingHandlers - extends grpc.UntypedServiceImplementation { - HealthCheck: grpc.handleUnaryCall< - _media_signaling_package_HealthCheckRequest__Output, - _media_signaling_package_HealthCheckResponse - >; +export interface MediaSignalingHandlers extends grpc.UntypedServiceImplementation { + SendMessage: grpc.handleBidiStreamingCall<_media_signaling_package_SendMessageRequest__Output, _media_signaling_package_SendMessageResponse>; + } export interface MediaSignalingDefinition extends grpc.ServiceDefinition { - HealthCheck: MethodDefinition< - _media_signaling_package_HealthCheckRequest, - _media_signaling_package_HealthCheckResponse, - _media_signaling_package_HealthCheckRequest__Output, - _media_signaling_package_HealthCheckResponse__Output - >; + SendMessage: MethodDefinition<_media_signaling_package_SendMessageRequest, _media_signaling_package_SendMessageResponse, _media_signaling_package_SendMessageRequest__Output, _media_signaling_package_SendMessageResponse__Output> } diff --git a/src/protos/media_signaling_package/SendMessageRequest.ts b/src/protos/media_signaling_package/SendMessageRequest.ts new file mode 100644 index 0000000..d533e6d --- /dev/null +++ b/src/protos/media_signaling_package/SendMessageRequest.ts @@ -0,0 +1,12 @@ +// Original file: src/protos/media-signaling.proto + + +export interface SendMessageRequest { + 'type'?: (string); + 'args'?: ({[key: string]: string}); +} + +export interface SendMessageRequest__Output { + 'type'?: (string); + 'args'?: ({[key: string]: string}); +} diff --git a/src/protos/media_signaling_package/SendMessageResponse.ts b/src/protos/media_signaling_package/SendMessageResponse.ts new file mode 100644 index 0000000..3502749 --- /dev/null +++ b/src/protos/media_signaling_package/SendMessageResponse.ts @@ -0,0 +1,12 @@ +// Original file: src/protos/media-signaling.proto + + +export interface SendMessageResponse { + 'type'?: (string); + 'args'?: ({[key: string]: string}); +} + +export interface SendMessageResponse__Output { + 'type'?: (string); + 'args'?: ({[key: string]: string}); +} diff --git a/src/servers/grpc-server.ts b/src/servers/grpc-server.ts index bff43cd..f7c692b 100644 --- a/src/servers/grpc-server.ts +++ b/src/servers/grpc-server.ts @@ -2,6 +2,7 @@ import * as grpc from '@grpc/grpc-js'; import * as protoLoader from '@grpc/proto-loader'; import path from 'path'; import { ProtoGrpcType } from '../protos/media-signaling'; +import { MediaSignalingHandlers } from '../protos/media_signaling_package/MediaSignaling'; class GrpcServer { private static instance: GrpcServer | null = null; @@ -22,17 +23,17 @@ class GrpcServer { return GrpcServer.instance; } - async start(port: number = 50051): Promise { + async start(port: number = 50052): Promise { try { this.server.bindAsync( `0.0.0.0:${port}`, grpc.ServerCredentials.createInsecure(), - () => { - // if (error) { - // console.log(error); - // throw error; - // } - this.server.start(); + (err, port) => { + if (err) { + console.error(err); + return; + } + console.log(`Your server as started on port ${port}`); } ); } catch (error) { @@ -56,19 +57,20 @@ class GrpcServer { protoDescriptor.media_signaling_package.MediaSignaling; this.server.addService(mediaSignaling.service, { - HealthCheck: this.healthCheck.bind(this), - }); - } + SendMessage: call => { + call.on('data', chunk => { + console.log('Message from client'); + console.log(chunk); + }); - // Health check implementation - private healthCheck( - call: grpc.ServerUnaryCall, - callback: grpc.sendUnaryData - ): void { - console.log('call', call.request); - callback(null, { - status: 1, // SERVING - }); + call.write({ + type: 'confirm connection', + args: { + status: 'success', + }, + }); + }, + } as MediaSignalingHandlers); } }