Skript addon that adds support for gRPC.
Important
SkGrpc depends on SkProtobuf. SkGrpc requires a descriptor set for the RPCs you wish to use with Skript, see SkProtobuf for more information about descriptor sets.
| Command | Permission | Description |
|---|---|---|
| /skgrpc reload | skgrpc.admin | Reload descriptors. |
See full example files here.
echo.proto
syntax = "proto3";
message EchoRequest { string message = 1; }
message EchoResponse { string message = 1; }
service EchoService { rpc Echo(EchoRequest) returns (EchoResponse) {} rpc EchoStream(stream EchoRequest) returns (stream EchoResponse) {} }
Create Channel
on load:
if {channel} is set:
shutdown grpc channel {channel}
set {_creds} to insecure channel credentials
set {channel} to new grpc channel:
host: "localhost"
port: 60123
credentials: {_creds}
Unary RPC
command /grpcecho <string>:
trigger:
# build request
set {_builder} to new builder for proto "EchoRequest"
set proto field "message" in {_builder} to arg-1
set {_request} to proto from builder {_builder}
# send request
set {_response} to response of rpc "Echo" for {_request} using {channel}
send "Client received response message: %value of proto field "message" in {_response}%"
Bidirectional Streaming
command /grpcechostream <string>:
trigger:
# start async rpc
set {_sender} to command sender
set {_stream} to request stream for rpc "EchoStream" using {channel}:
on next:
set {_message} to value of proto field "message" in event-protobufmessage
send "Client received response message: %{_message}%" to {_sender}
on error:
send "Client received error: %event-grpcstatus's code% - %event-grpcstatus's description%" to {_sender}
on complete:
send "Client finished receiving responses." to {_sender}
# send requests
loop arg-1 split at " ":
set {_builder} to new builder for proto "EchoRequest"
set proto field "message" in {_builder} to loop-value
send proto from builder {_builder} on rpc stream {_stream}
# tell the server we're done sending requests
complete rpc stream {_stream}
Create Server
on load:
if {server} is set:
shutdown grpc server {server}
set {_creds} to insecure server credentials
set {server} to new grpc server with services "EchoService":
port: 60123
credentials: {_creds}
setupEchoHandler({server})
setupEchoStreamHandler({server})
start grpc server {server}
Unary RPC
function setupEchoHandler(server: grpcserver):
rpc "Echo" handler for {_server}:
response:
set {_message} to value of proto field "message" in event-protobufmessage
broadcast "Server received request message: %{_message}%"
# send response
set {_response} to new builder for proto "EchoResponse"
set proto field "message" in {_response} to {_message}
return rpc response proto from builder {_response}
Bidirectional Streaming
function setupEchoStreamHandler(server: grpcserver):
rpc "EchoStream" handler for {_server}:
on connect:
# store the stream for sending responses
set {_stream} to event-grpcstream
on next:
set {_message} to value of proto field "message" in event-protobufmessage
broadcast "Server received request message: %{_message}%"
# send response
set {_response} to new builder for proto "EchoResponse"
set proto field "message" in {_response} to {_message}
send proto from builder {_response} on rpc stream {_stream}
on error:
broadcast "Server received error: %event-grpcstatus's code% - %event-grpcstatus's description%"
on complete:
broadcast "Server finished receiving requests."
# tell the client we're done sending responses
complete rpc stream {_stream}