This is pretty much just the API surface that is used in the demo code for now, with a couple of minor things I tacked on while getting a feel for how I was going to go about it. Unfortunately, the diff is too messy to show the improvement provided by the wrapped API, but I'm pretty pleased with how it is turning out so far. In general, there have been no major hiccups. Most of the time working on this was spent noodling about how to create the subscription callback thunk to provide type safety and pointer nullability guarantees for the subscription zig API. I'm satisfied with the solution in place now: it seems to have good default ergonomics and very few downsides except that the callback function must be known at compile time. An earlier iteration of this code supported runtime function pointers but had a showstopping problem with memory management. In order to store the runtime callback pointer, the thunk would need to be allocated, but there was no way of attaching our allocated memory to the c-library subscription object. No attachment meant that there were a number of error scenarios where the allocated thunk couldn't be freed correctly. Ultimately, if the user needs to use runtime callback pointers they can write a comptime known callback that calls a runtime known callback. This way all of the object lifetime and ownership is in the user's hands, which is really where it needs to belong anyway for this.
NATS - Zig Client
This is a Zig client library for the NATS messaging system. It's currently a thin wrapper over NATS.c.
There are three main goals:
- Provide a Zig package that can be used with the Zig package manager.
- Provide a native-feeling Zig client API.
- Support cross-compilation to the platforms that Zig supports.
Right now, in service of goal 3, the underlying C library is built without certain features (notably, without TLS support and without streaming support) because those features require wrangling some complex transitive dependencies (OpenSSL and Protocol Buffers, respectively). Solving this limitation is somewhere on the roadmap, but it's not high priority.
Building
Currently, a demonstration executable can be built in the standard fashion, i.e. by running zig build
.
License
Licensed under the Apache License, Version 2.0 (the "License");
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Description
Languages
Zig
99.3%
Shell
0.7%