Skip to content

Commit

Permalink
feat(@artusx/plugin-grpc): remove @GrpcClient(), use @Injectable()
Browse files Browse the repository at this point in the history
  • Loading branch information
thonatos committed Mar 28, 2024
1 parent 59f9022 commit 2a610f6
Show file tree
Hide file tree
Showing 10 changed files with 87 additions and 149 deletions.
18 changes: 10 additions & 8 deletions packages/apps/artusx-grpc/src/chat-module/chat.client.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
import assert from 'assert';
import * as grpc from '@grpc/grpc-js';
import { GrpcClient } from '@artusx/plugin-grpc';
import { ArtusXGrpcClientClass } from '@artusx/plugin-grpc/types';
import { ChatClient } from '../proto-codegen/chat';
import { Inject, ArtusInjectEnum, Injectable, ScopeEnum } from '@artus/core';
import { ChatClient as Client } from '../proto-codegen/chat';

@GrpcClient({
load: true,
@Injectable({
scope: ScopeEnum.EXECUTION,
})
export default class Chat extends ArtusXGrpcClientClass<ChatClient> {
init(addr: string) {
return new ChatClient(addr, grpc.credentials.createInsecure());
export default class ChatClient extends Client {
constructor(@Inject(ArtusInjectEnum.Config) public config: any) {
const { addr } = config.grpc?.client || {};
assert(addr, 'addr is required');
super(addr, grpc.credentials.createInsecure());
}
}
6 changes: 2 additions & 4 deletions packages/apps/artusx-grpc/src/chat-module/chat.schedule.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,16 @@ import ChatClient from './chat.client';
})
export default class NotifySchedule implements ArtusxSchedule {
@Inject(ChatClient)
chat: ChatClient;
chatClient: ChatClient;

private async invokeStatic() {
const chatClient = this.chat.getClient();

const message = new ClientMessage({
user: '@client',
text: 'hello',
});

try {
const response = await chatClient.join(message);
const response = await this.chatClient.join(message);
console.log('client:Chat:join', response.toObject());
} catch (error) {
console.error('error:', error.details);
Expand Down
6 changes: 2 additions & 4 deletions packages/apps/artusx-grpc/src/config/config.default.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,11 @@ import type { ArtusxGrpcConfig } from '@artusx/plugin-grpc';
export default () => {
const grpc: ArtusxGrpcConfig = {
client: {
host: '0.0.0.0',
port: 50051,
addr: '0.0.0.0:50051',
},

server: {
host: '0.0.0.0',
port: 50051,
addr: '0.0.0.0:50051',
},

static: {
Expand Down
32 changes: 20 additions & 12 deletions packages/apps/artusx-grpc/src/echo-module/echo.client.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,27 @@
import assert from 'assert';
import { credentials } from '@artusx/plugin-grpc/types';
import { Inject } from '@artus/core';
import { ArtusInjectEnum, Inject, Injectable, ScopeEnum } from '@artus/core';
import { ArtusXInjectEnum } from '@artusx/utils';
import { ArtusXGrpcClient, GrpcClient } from '@artusx/plugin-grpc';
import { ArtusXGrpcClientClass } from '@artusx/plugin-grpc/types';
import { ChatClient } from '../proto-codegen/chat';
import { ArtusXGrpcClient } from '@artusx/plugin-grpc';

@GrpcClient({
load: true,
@Injectable({
scope: ScopeEnum.EXECUTION,
})
export default class Chat extends ArtusXGrpcClientClass<ChatClient> {
@Inject(ArtusXInjectEnum.GRPC)
grpcClient: ArtusXGrpcClient;
export default class EchoClient {
private echoService: any;

init(addr: string) {
const EchoService = this.grpcClient.getService('grpc.examples.echo', 'Echo');
return new EchoService(addr, credentials.createInsecure());
constructor(
@Inject(ArtusInjectEnum.Config) public config: any,
@Inject(ArtusXInjectEnum.GRPC) public grpcClient: ArtusXGrpcClient
) {
const { addr } = config.grpc?.client || {};
assert(addr, 'addr is required');

const EchoService = grpcClient.getService('grpc.examples.echo', 'Echo');
this.echoService = new EchoService(addr, credentials.createInsecure());
}

UnaryEcho(call: any, callback: any) {
this.echoService.UnaryEcho(call, callback);
}
}
6 changes: 2 additions & 4 deletions packages/apps/artusx-grpc/src/echo-module/echo.schedule.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,10 @@ import EchoClient from './echo.client';
})
export default class NotifySchedule implements ArtusxSchedule {
@Inject(EchoClient)
echo: EchoClient;
echoClient: EchoClient;

private async invokeDynamic() {
const echoClient = this.echo.getClient();

echoClient.UnaryEcho({ message: 'ping' }, function (_err: Error, response: any) {
this.echoClient.UnaryEcho({ message: 'ping' }, function (_err: Error, response: any) {
console.log('client:Echo:UnaryEcho', response);
});
}
Expand Down
78 changes: 41 additions & 37 deletions packages/plugins/grpc/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,12 @@ import type { ArtusxGrpcConfig } from '@artusx/plugin-grpc';

export default () => {
const grpc: ArtusxGrpcConfig = {
client: {
host: '0.0.0.0',
port: 50051,
client: {
addr: "0.0.0.0:50051",
},

server: {
host: '0.0.0.0',
port: 50051,
server: {
addr: "0.0.0.0:50051",
},

static: {
Expand Down Expand Up @@ -109,18 +107,20 @@ export default class ChatService extends UnimplementedChatService {
Client

```ts
import assert from 'assert';
import * as grpc from '@grpc/grpc-js';
import { GrpcClient } from '@artusx/plugin-grpc';
import { ArtusXGrpcClientClass } from '@artusx/plugin-grpc/types';
import { ChatClient } from '../proto-codegen/chat';
import { Inject, ArtusInjectEnum, Injectable, ScopeEnum } from '@artus/core';
import { ChatClient as Client } from '../proto-codegen/chat';

@GrpcClient({
load: true,
@Injectable({
scope: ScopeEnum.EXECUTION,
})
export default class Chat extends ArtusXGrpcClientClass<ChatClient> {
init(addr: string) {
return new ChatClient(addr, grpc.credentials.createInsecure());
}
export default class ChatClient extends Client {
constructor(@Inject(ArtusInjectEnum.Config) public config: any) {
const { addr } = config.grpc?.client || {};
assert(addr, 'addr is required');
super(addr, grpc.credentials.createInsecure());
}
}
```

Expand All @@ -140,18 +140,16 @@ import ChatClient from './chat.client';
})
export default class NotifySchedule implements ArtusxSchedule {
@Inject(ChatClient)
chat: ChatClient;

private async invokeStatic() {
const chatClient = this.chat.getClient();
chatClient: ChatClient;

private async invokeStatic() {
const message = new ClientMessage({
user: '@client',
text: 'hello',
});

try {
const response = await chatClient.join(message);
const response = await this.chatClient.join(message);
console.log('client:Chat:join', response.toObject());
} catch (error) {
console.error('error:', error.details);
Expand Down Expand Up @@ -235,23 +233,31 @@ export default class EchoService {
Client

```ts
import assert from 'assert';
import { credentials } from '@artusx/plugin-grpc/types';
import { Inject } from '@artus/core';
import { ArtusInjectEnum, Inject, Injectable, ScopeEnum } from '@artus/core';
import { ArtusXInjectEnum } from '@artusx/utils';
import { ArtusXGrpcClient, GrpcClient } from '@artusx/plugin-grpc';
import { ArtusXGrpcClientClass } from '@artusx/plugin-grpc/types';
import { ChatClient } from '../proto-codegen/chat';
import { ArtusXGrpcClient } from '@artusx/plugin-grpc';

@GrpcClient({
load: true,
@Injectable({
scope: ScopeEnum.EXECUTION,
})
export default class Chat extends ArtusXGrpcClientClass<ChatClient> {
@Inject(ArtusXInjectEnum.GRPC)
grpcClient: ArtusXGrpcClient;
export default class EchoClient {
private echoService: any;

constructor(
@Inject(ArtusInjectEnum.Config) public config: any,
@Inject(ArtusXInjectEnum.GRPC) public grpcClient: ArtusXGrpcClient,
) {
const { addr } = config.grpc?.client || {};
assert(addr, 'addr is required');

const EchoService = grpcClient.getService('grpc.examples.echo', 'Echo');
this.echoService = new EchoService(addr, credentials.createInsecure());
}

init(addr: string) {
const EchoService = this.grpcClient.getService('grpc.examples.echo', 'Echo');
return new EchoService(addr, credentials.createInsecure());
UnaryEcho(call: any, callback: any) {
this.echoService.UnaryEcho(call, callback)
}
}
```
Expand All @@ -272,12 +278,10 @@ import EchoClient from './echo.client';
})
export default class NotifySchedule implements ArtusxSchedule {
@Inject(EchoClient)
echo: EchoClient;

private async invokeDynamic() {
const echoClient = this.echo.getClient();
echoClient: EchoClient;

echoClient.UnaryEcho({ message: 'ping' }, function (_err: Error, response: any) {
private async invokeDynamic() {
this.echoClient.UnaryEcho({ message: 'ping' }, function (_err: Error, response: any) {
console.log('client:Echo:UnaryEcho', response);
});
}
Expand Down
15 changes: 8 additions & 7 deletions packages/plugins/grpc/src/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,14 @@ import type { ArtusXGrpcServiceList, ArtusXGrpcServiceMap } from './types';

export interface ArtusxGrpcConfig {
client?: {
host: string;
port: number;
// host: string;
// port: number;
addr: string;
};
server?: {
host: string;
port: number;
// host: string;
// port: number;
addr: string;
};

// static
Expand Down Expand Up @@ -179,10 +181,9 @@ export default class ArtusXGrpcClient {
) {
assert(this._config?.server, 'server config is required');

const { host = '0.0.0.0', port = '50051' } = this._config?.server;
const { addr } = this._config?.server;

const server = new grpc.Server();
const serverUrl = `${host}:${port}`;

const { dynamicService, staticService } = services;

Expand Down Expand Up @@ -210,7 +211,7 @@ export default class ArtusXGrpcClient {
server.addService(definition, instance);
}

server.bindAsync(serverUrl, grpc.ServerCredentials.createInsecure(), callback);
server.bindAsync(addr, grpc.ServerCredentials.createInsecure(), callback);

this._server = server;
}
Expand Down
22 changes: 1 addition & 21 deletions packages/plugins/grpc/src/decorator.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,10 @@
import { addTag, Injectable, ScopeEnum } from '@artus/core';

export const GRPC_CLIENT_TAG = 'GRPC_CLIENT_TAG';
export const GRPC_CLIENT_METADATA = Symbol.for('GRPC_CLIENT_METADATA');

export const GRPC_SERVICE_TAG = 'GRPC_SERVICE_TAG';
export const GRPC_SERVICE_METADATA = Symbol.for('GRPC_SERVICE_METADATA');

export const GRPC_METHOD_METADATA = Symbol.for('GRPC_METHOD_METADATA');

import { ArtusxGrpcServiceMetadata, ArtusxGrpcClientMetadata, ArtusxGrpcMethodMetadata } from './types';
import { ArtusxGrpcServiceMetadata, ArtusxGrpcMethodMetadata } from './types';

/**
* Grpc service decorator
Expand Down Expand Up @@ -40,19 +36,3 @@ export function GrpcMethod(options?: ArtusxGrpcMethodMetadata) {
return descriptor;
};
}

/**
* GRPC client decorator
* @param options GrpcClientOptions
* @example @GrpcClient()
* @returns void
*/
export function GrpcClient(options: ArtusxGrpcClientMetadata) {
return (target: any) => {
const clientMetadata = options;

Reflect.defineMetadata(GRPC_CLIENT_METADATA, clientMetadata, target);
addTag(GRPC_CLIENT_TAG, target);
Injectable({ scope: ScopeEnum.SINGLETON })(target);
};
}
37 changes: 1 addition & 36 deletions packages/plugins/grpc/src/lifecycle.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,8 @@ import {
} from '@artus/core';
import { ArtusXInjectEnum } from './constants';
import ArtusXGrpcClient, { ArtusxGrpcConfig } from './client';
import { GRPC_SERVICE_TAG, GRPC_SERVICE_METADATA, GRPC_METHOD_METADATA } from './decorator';
import {
GRPC_CLIENT_TAG,
GRPC_CLIENT_METADATA,
GRPC_SERVICE_TAG,
GRPC_SERVICE_METADATA,
GRPC_METHOD_METADATA,
} from './decorator';
import {
ArtusxGrpcClientMetadata,
ArtusxGrpcServiceMetadata,
ArtusxGrpcMethodMetadata,
ArtusXGrpcMethodMap,
Expand All @@ -38,30 +31,6 @@ export default class GRPCLifecycle implements ApplicationLifecycle {
return this.app.container;
}

private async loadClient(options: ArtusxGrpcConfig['client']) {
if (!options) {
return;
}

const { host, port } = options;

const serverUrl = `${host}:${port}`;

const clientClazzList = this.container.getInjectableByTag(GRPC_CLIENT_TAG);

for (const clientClazz of clientClazzList) {
const clientMetadata: ArtusxGrpcClientMetadata = Reflect.getMetadata(GRPC_CLIENT_METADATA, clientClazz);

if (!clientMetadata.load) {
continue;
}

const client = this.container.get(clientClazz) as any;
const instance = client.init(serverUrl);
client.setClient(instance);
}
}

private async loadService() {
const serviceClazzList = this.container.getInjectableByTag(GRPC_SERVICE_TAG);

Expand Down Expand Up @@ -134,10 +103,6 @@ export default class GRPCLifecycle implements ApplicationLifecycle {
await client.genStaticCode(config.static);
}

if (config.client) {
await this.loadClient(config.client);
}

if (config.server) {
const services = await this.loadService();
await client.initServer(services, (err, port) => {
Expand Down
Loading

0 comments on commit 2a610f6

Please sign in to comment.