Skip to content

Commit 07d391b

Browse files
authored
Example updates (#6)
1 parent 1a8d087 commit 07d391b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+2449
-3087
lines changed

examples/gradle-ts-protoc-gen/.gitignore

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
node_modules
2-
*.js
3-
proto/*.ts
2+
**/*.js
3+
!proto/*.js
44

55
# Ignore Gradle project-specific cache directory
66
.gradle

examples/gradle-ts-protoc-gen/.vscode/extensions.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
"dbaeumer.vscode-eslint",
44
"EditorConfig.EditorConfig",
55
"esbenp.prettier-vscode",
6-
"streetsidesoftware.code-spell-checker"
6+
"streetsidesoftware.code-spell-checker",
7+
"zxh404.vscode-proto3"
78
]
89
}
+28-14
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
# gradle-ts-protoc-gen
1+
# gradle-ts-protoc-gen example
22

3-
This examples shows how to uses [Gradle](https://gradle.org/), the [proto compiler](https://www.npmjs.com/package/grpc-tools), [`ts-protoc-gen`](https://www.npmjs.com/package/ts-protoc-gen) & [`@grpc/grpc-js`](https://www.npmjs.com/package/@grpc/grpc-js) to build a (not quite yet) fully typed gRPC CLI chat application that runs on Node.js.
3+
This examples shows how to uses [Gradle](https://gradle.org/), the [proto compiler](https://www.npmjs.com/package/grpc-tools), [`ts-protoc-gen`](https://www.npmjs.com/package/ts-protoc-gen) & [`@grpc/grpc-js`](https://www.npmjs.com/package/@grpc/grpc-js) to build a (not quite yet) fully typed gRPC application that runs on Node.js.
44

55
The [proto compiler](https://www.npmjs.com/package/grpc-tools) and [`ts-protoc-gen`](https://www.npmjs.com/package/ts-protoc-gen) compiler plugin are used to generate JavaScript & TypeScript files from the proto definitions. The [`protobuf-gradle-plugin`](https://github.com/google/protobuf-gradle-plugin) Gradle plugin is used to run the compiler from Gradle.
66

7-
The generated code uses [`google-protobuf`](https://www.npmjs.com/package/google-protobuf) & [`@grpc/grpc-js`](https://www.npmjs.com/package/@grpc/grpc-js) at runtime.
7+
[`google-protobuf`](https://www.npmjs.com/package/google-protobuf) & [`@grpc/grpc-js`](https://www.npmjs.com/package/@grpc/grpc-js) is used at runtime.
88

99
## App layout
1010

@@ -16,31 +16,45 @@ The generated code uses [`google-protobuf`](https://www.npmjs.com/package/google
1616

1717
## Generating the Types
1818

19+
Install dependencies:
20+
1921
```sh
20-
./gradlew generateProto
22+
npm install
2123
```
2224

23-
### Running the app
25+
Use Gradle & [`ts-protoc-gen`](https://www.npmjs.com/package/ts-protoc-gen) to generate the TypeScript files:
26+
27+
```sh
28+
./gradlew generateProto
29+
```
2430

25-
First build the types and application files:
31+
This is aliased as a npm script:
2632

2733
```sh
28-
npm install
29-
npm run build # this runs `./gradlew generateProto`
34+
npm run build:proto
3035
```
3136

32-
Start the server:
37+
### Running the App
38+
39+
This simple app demonstrates the different gRPC calls you can perform.
40+
41+
First generated the types and build the application files:
3342

3443
```sh
35-
npm run start:server
44+
npm run build
3645
```
3746

38-
Now run the client in different terminal sessions:
47+
Start the server:
3948

4049
```sh
41-
npm run start:client
50+
npm run start:server
4251
```
4352

44-
## Credits
53+
Now run the client by specifying which example you want to run:
4554

46-
The chat application idea is inspired from https://techblog.fexcofts.com/2018/07/20/grpc-nodejs-chat-example/
55+
```bash
56+
npm run start:client -- --unary
57+
npm run start:client -- --server-streaming
58+
npm run start:client -- --client-streaming
59+
npm run start:client -- --bidi-streaming
60+
```

examples/gradle-ts-protoc-gen/build.gradle

+1-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ protobuf {
6060
}
6161

6262
task copyGeneratedProto(type: Copy) {
63-
from '$protobuf.generatedFilesBaseDir/main/ts', '$protobuf.generatedFilesBaseDir/main/js'
63+
from "$protobuf.generatedFilesBaseDir/main/ts", "$protobuf.generatedFilesBaseDir/main/js"
6464
into 'proto'
6565
}
6666

+83-27
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,100 @@
11
import * as grpc from '@grpc/grpc-js';
2-
import readline from 'readline';
3-
import { ChatClient } from './proto/chat_grpc_pb';
4-
import { ClientMessage, ServerMessage } from './proto/chat_pb';
2+
import { ExampleClient } from './proto/example_grpc_pb';
3+
import { ClientMessage, ServerMessage } from './proto/example_pb';
54

6-
const rl = readline.createInterface({
7-
input: process.stdin,
8-
output: process.stdout,
9-
});
5+
const host = '0.0.0.0:9090';
106

11-
const client = new ChatClient(
12-
'0.0.0.0:9090',
13-
grpc.credentials.createInsecure()
14-
);
7+
const client = new ExampleClient(host, grpc.credentials.createInsecure());
158

169
const deadline = new Date();
1710
deadline.setSeconds(deadline.getSeconds() + 5);
1811
client.waitForReady(deadline, (error?: Error) => {
1912
if (error) {
20-
console.log(`Client error: ${error}`);
13+
console.log(`Client connect error: ${error.message}`);
2114
} else {
22-
rl.question("What's your name? ", startChat);
15+
onClientReady();
2316
}
2417
});
2518

26-
function startChat(user: string) {
19+
function onClientReady() {
20+
switch (process.argv[process.argv.length - 1]) {
21+
case '--unary':
22+
doUnaryCall();
23+
break;
24+
case '--server-streaming':
25+
doServerStreamingCall();
26+
break;
27+
case '--client-streaming':
28+
doClientStreamingCall();
29+
break;
30+
case '--bidi-streaming':
31+
doBidirectionalStreamingCallStreamingCall();
32+
break;
33+
default:
34+
throw new Error('Example not specified');
35+
}
36+
}
37+
38+
function doUnaryCall() {
2739
const clientMessage = new ClientMessage();
28-
clientMessage.setUser(user);
29-
const channel = client.join(clientMessage);
30-
channel.on('data', (message: ServerMessage) => {
31-
if (message.getUser() == user) {
32-
return;
40+
clientMessage.setClientMessage('Message from client');
41+
client.unaryCall(
42+
clientMessage,
43+
(error: grpc.ServiceError | null, serverMessage?: ServerMessage) => {
44+
if (error) {
45+
console.error(error.message);
46+
} else if (serverMessage) {
47+
console.log(
48+
`(client) Got server message: ${serverMessage.getServerMessage()}`
49+
);
50+
}
3351
}
34-
console.log(`${message.getUser()}: ${message.getText()}`);
52+
);
53+
}
54+
55+
function doServerStreamingCall() {
56+
const clientMessage = new ClientMessage();
57+
clientMessage.setClientMessage('Message from client');
58+
const stream = client.serverStreamingCall(clientMessage);
59+
stream.on('data', (serverMessage: ServerMessage) => {
60+
console.log(
61+
`(client) Got server message: ${serverMessage.getServerMessage()}`
62+
);
3563
});
36-
rl.on('line', function (text) {
37-
const clientMessage = new ClientMessage();
38-
clientMessage.setUser(user);
39-
clientMessage.setText(text);
40-
client.send(clientMessage, () => {
41-
//
42-
});
64+
}
65+
66+
function doClientStreamingCall() {
67+
const stream = client.clientStreamingCall(
68+
(error: grpc.ServiceError | null, serverMessage?: ServerMessage) => {
69+
if (error) {
70+
console.error(error.message);
71+
} else if (serverMessage) {
72+
console.log(
73+
`(client) Got server message: ${serverMessage.getServerMessage()}`
74+
);
75+
}
76+
}
77+
);
78+
const clientMessage = new ClientMessage();
79+
clientMessage.setClientMessage('Message from client');
80+
stream.write(clientMessage);
81+
82+
// eslint-disable-next-line @typescript-eslint/no-empty-function
83+
setTimeout(() => {}, 1000);
84+
}
85+
86+
function doBidirectionalStreamingCallStreamingCall() {
87+
const stream = client.bidirectionalStreamingCall();
88+
89+
// Server stream
90+
stream.on('data', (serverMessage: ServerMessage) => {
91+
console.log(
92+
`(client) Got server message: ${serverMessage.getServerMessage()}`
93+
);
4394
});
95+
96+
// Client stream
97+
const clientMessage = new ClientMessage();
98+
clientMessage.setClientMessage('Message from client');
99+
stream.write(clientMessage);
44100
}

0 commit comments

Comments
 (0)