Skip to content

Commit

Permalink
refactor packages
Browse files Browse the repository at this point in the history
- give a better name for interface
- export close and getPackages methods for core's client
- track init service method to fix issue when hot reloading
- create common helpers for client
- create common helpers for server
- fix onClose hook for fastify grpc client
- support array options to init multiple clients/servers
  • Loading branch information
zgid123 committed Apr 16, 2023
1 parent 331234d commit 5ea3285
Show file tree
Hide file tree
Showing 24 changed files with 928 additions and 623 deletions.
25 changes: 15 additions & 10 deletions examples/fastify/src/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,21 @@ async function bootstrap(): Promise<typeof fastify> {
},
});

fastify.get('/', async (_request, reply) => {
const result = await fastify.grpcClient
.getService('ExampleService')
.sendMessage(
{ message: 'hello', createdAt: dateToGrpcTimestamp(new Date()) },
createMetadata({
meta: 'test',
}),
);

console.log(result);

reply.send('Ok!');
});

const port = await detect(3_000);
await fastify.listen({
port,
Expand All @@ -77,16 +92,6 @@ async function bootstrap(): Promise<typeof fastify> {
};
});

const result = await fastify.grpcClient
.getService('ExampleService')
.sendMessage(
{ message: 'hello', createdAt: dateToGrpcTimestamp(new Date()) },
createMetadata({
meta: 'test',
}),
);
console.log(result);

return fastify;
}

Expand Down
4 changes: 4 additions & 0 deletions packages/commons/client/.npmignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
.turbo
src
tsconfig.json
rollup.config.ts
26 changes: 26 additions & 0 deletions packages/commons/client/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
{
"name": "@grpc.ts/client-commons",
"version": "1.0.0",
"license": "MIT",
"directories": {
"lib": "lib"
},
"author": "Alpha",
"description": "Common helpers for gRPC Client projects",
"main": "./lib/index.cjs",
"module": "./lib/index.mjs",
"types": "./lib/index.d.ts",
"exports": {
".": {
"import": "./lib/index.mjs",
"require": "./lib/index.cjs",
"types": "./lib/index.d.ts"
}
},
"scripts": {
"build": "rollup --config rollup.config.ts --configPlugin typescript"
},
"dependencies": {
"@grpc.ts/core": "workspace:*"
}
}
21 changes: 21 additions & 0 deletions packages/commons/client/rollup.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import { defineConfig } from 'rollup';
import json from '@rollup/plugin-json';
import commonjs from '@rollup/plugin-commonjs';
import resolve from '@rollup/plugin-node-resolve';
import typescript from '@rollup/plugin-typescript';

export default defineConfig({
input: 'src/index.ts',
plugins: [json(), resolve(), commonjs(), typescript()],
external: ['@grpc.ts/core'],
output: [
{
file: './lib/index.cjs',
format: 'cjs',
},
{
file: './lib/index.mjs',
format: 'es',
},
],
});
35 changes: 35 additions & 0 deletions packages/commons/client/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import { createClient } from '@grpc.ts/core';

import type {
IGrpcClientProps,
IGrpcClientListProps,
} from '@grpc.ts/core/lib/interface';

export async function createClients(
options: IGrpcClientProps | IGrpcClientProps[],
): Promise<IGrpcClientListProps> {
if (!Array.isArray(options)) {
options = [options];
}

const clients = await Promise.allSettled(
options.map(async ({ clientName = '', ...opts }) => {
const client = await createClient(opts);

return {
client,
clientName,
};
}),
);

return clients.reduce<IGrpcClientListProps>((result, settledServer) => {
if (settledServer.status === 'fulfilled') {
const { client, clientName } = settledServer.value;

result[clientName] = client;
}

return result;
}, {});
}
14 changes: 14 additions & 0 deletions packages/commons/client/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"extends": "../../../tsconfig.json",
"compilerOptions": {
"baseUrl": "./src",
"outDir": "./lib",
},
"include": [
"./src"
],
"exclude": [
"./lib",
"./node_modules"
]
}
4 changes: 4 additions & 0 deletions packages/commons/server/.npmignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
.turbo
src
tsconfig.json
rollup.config.ts
26 changes: 26 additions & 0 deletions packages/commons/server/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
{
"name": "@grpc.ts/server-commons",
"version": "1.0.0",
"license": "MIT",
"directories": {
"lib": "lib"
},
"author": "Alpha",
"description": "Common helpers for gRPC Server projects",
"main": "./lib/index.cjs",
"module": "./lib/index.mjs",
"types": "./lib/index.d.ts",
"exports": {
".": {
"import": "./lib/index.mjs",
"require": "./lib/index.cjs",
"types": "./lib/index.d.ts"
}
},
"scripts": {
"build": "rollup --config rollup.config.ts --configPlugin typescript"
},
"dependencies": {
"@grpc.ts/core": "workspace:*"
}
}
21 changes: 21 additions & 0 deletions packages/commons/server/rollup.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import { defineConfig } from 'rollup';
import json from '@rollup/plugin-json';
import commonjs from '@rollup/plugin-commonjs';
import resolve from '@rollup/plugin-node-resolve';
import typescript from '@rollup/plugin-typescript';

export default defineConfig({
input: 'src/index.ts',
plugins: [json(), resolve(), commonjs(), typescript()],
external: ['@grpc.ts/core'],
output: [
{
file: './lib/index.cjs',
format: 'cjs',
},
{
file: './lib/index.mjs',
format: 'es',
},
],
});
35 changes: 35 additions & 0 deletions packages/commons/server/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import { createServer } from '@grpc.ts/core';

import type {
IGrpcServerProps,
IGrpcServerListProps,
} from '@grpc.ts/core/lib/interface';

export async function createServers(
options: IGrpcServerProps | IGrpcServerProps[],
): Promise<IGrpcServerListProps> {
if (!Array.isArray(options)) {
options = [options];
}

const servers = await Promise.allSettled(
options.map(async ({ serverName = '', ...opts }) => {
const serverObj = await createServer(opts);

return {
serverObj,
serverName,
};
}),
);

return servers.reduce<IGrpcServerListProps>((result, settledServer) => {
if (settledServer.status === 'fulfilled') {
const { serverName, serverObj } = settledServer.value;

result[serverName] = serverObj;
}

return result;
}, {});
}
14 changes: 14 additions & 0 deletions packages/commons/server/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"extends": "../../../tsconfig.json",
"compilerOptions": {
"baseUrl": "./src",
"outDir": "./lib",
},
"include": [
"./src"
],
"exclude": [
"./lib",
"./node_modules"
]
}
2 changes: 1 addition & 1 deletion packages/core/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ yarn add @grpc.ts/core

# or

pnpm add @gprc-ts/core
pnpm add @grpc.ts/core
```

# Usage
Expand Down
2 changes: 1 addition & 1 deletion packages/core/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@grpc.ts/core",
"version": "1.0.0",
"version": "1.1.0",
"license": "MIT",
"directories": {
"lib": "lib"
Expand Down
37 changes: 20 additions & 17 deletions packages/core/src/client.ts
Original file line number Diff line number Diff line change
@@ -1,31 +1,20 @@
import { credentials } from '@grpc/grpc-js';

import type { ServiceClient } from '@grpc/grpc-js/build/src/make-client';

import { loadPackage, makeServiceClients } from './internalUtils';

import type { IClientProps } from './interface';

interface IGetServiceOptionsProps {
packageName?: string;
}

type TGetServiceFunc = <T extends ServiceClient = ServiceClient>(
serviceName: string,
options?: IGetServiceOptionsProps,
) => T | undefined;

export interface IGrpcClientProps {
getService: TGetServiceFunc;
}
import type {
IClientProps,
TGetServiceFunc,
IGrpcClientWrapperProps,
} from './interface';

export async function createClient({
url,
options = {},
credentials: creds,
package: packageInfo,
packageDefinitionOptions,
}: IClientProps): Promise<IGrpcClientProps> {
}: IClientProps): Promise<IGrpcClientWrapperProps> {
const packageDefs = await loadPackage({
package: packageInfo,
packageDefinitionOptions,
Expand All @@ -44,7 +33,21 @@ export async function createClient({
return clients[packageName]?.[serviceName] as any; // TODO: fix type
};

const close = () => {
Object.values(clients).forEach((client) => {
Object.values(client).forEach((sc) => {
sc.close();
});
});
};

const getPackages: IGrpcClientWrapperProps['getPackages'] = () => {
return clients;
};

return {
close,
getService,
getPackages,
};
}
11 changes: 9 additions & 2 deletions packages/core/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,17 @@
export { createSecureContext } from 'tls';
export { credentials } from '@grpc/grpc-js';
export { credentials, Metadata, type ServerUnaryCall } from '@grpc/grpc-js';
export type { ServiceClient } from '@grpc/grpc-js/build/src/make-client';
export type { Timestamp } from 'google-protobuf/google/protobuf/timestamp_pb';

export * from './dataType';
export * from './client';
export * from './server';
export * from './utils';

export type { IClientProps, IServerProps } from './interface';
export type {
IClientProps,
IServerProps,
IServerWrapperProps,
TAddUnaryHandlerFunc,
IAddUnaryHandlerOptionsProps,
} from './interface';
Loading

0 comments on commit 5ea3285

Please sign in to comment.