feat: centralize grpc client registration
All checks were successful
Publish / Publish Job (push) Successful in 44s
All checks were successful
Publish / Publish Job (push) Successful in 44s
This commit is contained in:
1
lib/grpc/constants/grpc.constants.ts
Normal file
1
lib/grpc/constants/grpc.constants.ts
Normal file
@@ -0,0 +1 @@
|
||||
export const GRPC_CLIENT_PREFIX = 'GRPC_CLIENT'
|
||||
1
lib/grpc/decorators/index.ts
Normal file
1
lib/grpc/decorators/index.ts
Normal file
@@ -0,0 +1 @@
|
||||
export * from './inject-grpc-client.decorator'
|
||||
6
lib/grpc/decorators/inject-grpc-client.decorator.ts
Normal file
6
lib/grpc/decorators/inject-grpc-client.decorator.ts
Normal file
@@ -0,0 +1,6 @@
|
||||
import { Inject } from '@nestjs/common'
|
||||
|
||||
import { GRPC_CLIENT_PREFIX } from '../constants/grpc.constants'
|
||||
|
||||
export const InjectGrpcClient = (name: string) =>
|
||||
Inject(`${GRPC_CLIENT_PREFIX}_${name}`)
|
||||
36
lib/grpc/factory/grpc-client.factory.ts
Normal file
36
lib/grpc/factory/grpc-client.factory.ts
Normal file
@@ -0,0 +1,36 @@
|
||||
import { Injectable } from '@nestjs/common'
|
||||
import {
|
||||
ClientGrpc,
|
||||
ClientProxyFactory,
|
||||
Transport
|
||||
} from '@nestjs/microservices'
|
||||
|
||||
@Injectable()
|
||||
export class GrpcClientFactory {
|
||||
private clients = new Map<string, ClientGrpc>()
|
||||
|
||||
public createClient(options: {
|
||||
package: string
|
||||
protoPath: string
|
||||
url: string
|
||||
}) {
|
||||
return ClientProxyFactory.create({
|
||||
transport: Transport.GRPC,
|
||||
options
|
||||
}) as ClientGrpc
|
||||
}
|
||||
|
||||
public register(token: string, client: ClientGrpc) {
|
||||
this.clients.set(token, client)
|
||||
}
|
||||
|
||||
public getClient<T extends ClientGrpc = ClientGrpc>(token: string): T {
|
||||
const client = this.clients.get(token)
|
||||
|
||||
if (!client) {
|
||||
throw new Error(`gRPC client with token ${token} not found`)
|
||||
}
|
||||
|
||||
return client as T
|
||||
}
|
||||
}
|
||||
46
lib/grpc/grpc.module.ts
Normal file
46
lib/grpc/grpc.module.ts
Normal file
@@ -0,0 +1,46 @@
|
||||
import { type DynamicModule, Module } from '@nestjs/common'
|
||||
import { ConfigService } from '@nestjs/config'
|
||||
|
||||
import { GRPC_CLIENT_PREFIX } from './constants/grpc.constants'
|
||||
import { GrpcClientFactory } from './factory/grpc-client.factory'
|
||||
import { GRPC_CLIENTS } from './registry/grpc.registry'
|
||||
|
||||
@Module({})
|
||||
export class GrpcModule {
|
||||
public static register(
|
||||
clients: Array<keyof typeof GRPC_CLIENTS>
|
||||
): DynamicModule {
|
||||
return {
|
||||
module: GrpcModule,
|
||||
providers: [
|
||||
GrpcClientFactory,
|
||||
...clients.map(token => {
|
||||
const cfg = GRPC_CLIENTS[token]
|
||||
return {
|
||||
provide: `${GRPC_CLIENT_PREFIX}_${token}`,
|
||||
useFactory: (
|
||||
factory: GrpcClientFactory,
|
||||
config: ConfigService
|
||||
) => {
|
||||
const url = config.getOrThrow(cfg.env)
|
||||
const client = factory.createClient({
|
||||
package: cfg.package,
|
||||
protoPath: cfg.protoPath,
|
||||
url
|
||||
})
|
||||
|
||||
factory.register(token, client)
|
||||
|
||||
return client
|
||||
},
|
||||
inject: [GrpcClientFactory, ConfigService]
|
||||
}
|
||||
})
|
||||
],
|
||||
exports: [
|
||||
GrpcClientFactory,
|
||||
...clients.map(token => `${GRPC_CLIENT_PREFIX}_${token}`)
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
2
lib/grpc/index.ts
Normal file
2
lib/grpc/index.ts
Normal file
@@ -0,0 +1,2 @@
|
||||
export * from './decorators'
|
||||
export * from './grpc.module'
|
||||
39
lib/grpc/registry/grpc.registry.ts
Normal file
39
lib/grpc/registry/grpc.registry.ts
Normal file
@@ -0,0 +1,39 @@
|
||||
import { PROTO_PATHS } from '@lendry-erp/contracts'
|
||||
|
||||
export const GRPC_CLIENTS = {
|
||||
AUTH_PACKAGE: {
|
||||
package: 'auth.v1',
|
||||
protoPath: PROTO_PATHS.AUTH,
|
||||
env: 'AUTH_GRPC_URL'
|
||||
},
|
||||
ACCOUNT_PACKAGE: {
|
||||
package: 'account.v1',
|
||||
protoPath: PROTO_PATHS.ACCOUNT,
|
||||
env: 'AUTH_GRPC_URL'
|
||||
},
|
||||
RBAC_PACKAGE: {
|
||||
package: 'rbac.v1',
|
||||
protoPath: PROTO_PATHS.ACCOUNT,
|
||||
env: 'AUTH_GRPC_URL'
|
||||
},
|
||||
TWOFA_PACKAGE: {
|
||||
package: 'two_fa.v1',
|
||||
protoPath: PROTO_PATHS.TWOFA,
|
||||
env: 'AUTH_GRPC_URL'
|
||||
},
|
||||
LDAP_AUTH_PACKAGE: {
|
||||
package: 'ldap_auth.v1',
|
||||
protoPath: PROTO_PATHS.LDAP_AUTH,
|
||||
env: 'LDAP_AUTH_GRPC_URL'
|
||||
},
|
||||
LDAP_PACKAGE: {
|
||||
package: 'ldap.v1',
|
||||
protoPath: PROTO_PATHS.LDAP,
|
||||
env: 'LDAP_GRPC_URL'
|
||||
},
|
||||
SEARCH_PACKAGE: {
|
||||
package: 'search.v1',
|
||||
protoPath: PROTO_PATHS.SEARCH,
|
||||
env: 'SEARCH_GRPC_URL'
|
||||
}
|
||||
} as const
|
||||
Reference in New Issue
Block a user