pharo-protobuf

Details

Source
GitHub
Dialect
pharo (25% confidence)
Stars
7
Forks
3
Created
Feb. 26, 2019
Updated
May 31, 2025

README excerpt

# An implementation of Google Protobuf for Smalltalk/Pharo

This repository contains support for Google Protobuf and bindings
to GRPC.

## Google Protobuf

The code includes an encoder/decoder for binary Google Protobuf
and a code generator that takes Googles protoc definition and can
generate Pharo code.

### Use protoc to generate a binary definition

```shell
protoc -o tf.pb --include_imports tensorflow/core/framework/graph.proto
```

### Generate Smalltalk code from the description

```smalltalk
| descriptor nameTable generator |
"1. Decode the 'tf.pb' file into a descriptor"
descriptor := GPBFileDescriptorSet
	  materializeFrom: 'tf.pb' asFileReference  binaryReadStream.

"2. Set-up a type/name table and apply a custom prefix to all types"
nameTable := GPBTypeNamesVisitor new.
nameTable customPrefix: 'TF_'.

"3. Set-up the class/type generator and specify the target package for the code"
generator := GPBGeneratingVisitor new
  typeNames: nameTable;
  targetPackage: 'Tensorflow-Definitions'.
  
"4. Generate types and code"
descriptor visit: nameTable.
generator visit: descriptor.
```

### Use the generated code

```smalltalk
TF_GraphDef materializeFrom: 'inception_v3_2016_08_28_frozen.pb' asFileReference binaryReadStream
```


## gRPC code

The repository includes work-in-progress bindings to the gRPC C library. This
requires at least Pharo8.0 to include FFI fixes.


## State of simple things

```
| channel queue stub |
 "Create a new gRPC channel to a destination."
 channel := GrpcChannel newInsecure: 'localhost:50051'.
 channel check_connectivity: 1.

 "Create a gRPC client stub for the global completionQueue."
 queue := GrpcLibrary uniqueInstance completionQueue.
 stub := GrpcClientStub initWith: channel queue: queue.

 "Make an unary call to 'SayHello' and encode a protobuf on the fly
 and wait up to one second for the completion. E.g. start the C++
 server on the other side"
 stub genericUnaryCall: '/helloworld.Greeter/SayHello' asByteArray param: (GRPC_EX_HLWHelloRequest new name: 'Smalltalk'; materialize) resultClass: GRPC_EX_HLWHelloReply timeout: 1 seconds
```

### What

This was tested on macOs against v1.19.x of gRPC (4566c2a29ebec0835643b972eb99f4306c4234a3)
installed to `/usr/local/lib/libgrpc.dylib`.


### Known issues

* ProtoBuf slots are not properly initialized on load. Fix this by running
  `PBTypeName allSubclassesDo: #resolveEncodingType` after everything is loaded.

* `GrpcLibrary startUp: true` must be called once on start up. This is fixed by having
  a baseline.

* `GrpcLibrary uniqueInstance completionQueue` polls for completion (limiting throughput
  and adds fixed latency cost).

* Test failure on Linux with v1.27.x of gRPC in the completion queue.


### Todos

* Create `BaselineOfGrpc` and load packages and run resolveEncodingType on load.
* Enable CI tests on travis-ci/github actions.
* Only `GrpcClientStub>>#genericUnaryCall:...` is implemented.
* Basic server support is missing.
* Streaming client/server is missing.
* Add completion by calling a block (in addition to the waiting on a semaphore)
* Introspection for the server (which interfaces supported)
* Windows and Linux support
* Remove polling for a plugin..
* Image suspend/resume with outstanding gRPC calls.
* Generate server and client stubs based on the service definition.
← Back to results