All notable changes to this package are documented here. The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Unreleased
0.1.0 - 2026-08-13
The first release: TypeDB over gRPC, the protocol TypeDB's own Rust, Java, Python and Node drivers speak.
It is the sibling of typedb and depends on
it. Concepts decode into the same TypeDB.Concept structs and failures arrive
as the same %TypeDB.Error{}, so an application that switches transports
changes the module it calls and not the code that reads what comes back — a
claim a shared behaviour suite runs through both drivers on every push rather
than leaving to good intentions.
Why this transport
Three things the HTTP API cannot do. The first it cannot do at all; the other two are measured against TypeDB 3.12.1 with driver and server on one machine.
A database can be exported and imported.
Database.export_to_files/5andimport_from_files/5, plusTypeDB.GRPC.export_database/5andimport_database/5. TypeDB's HTTP API has no such endpoint —/v1/databases/x/exportanswers 404 to a token that gets 200 from/schema— so a graph written through the sibling can only be read back by replaying whatever the application logged.The files are TypeDB's own format, not this driver's: a dump taken by
typedb consoleand one taken here are byte-identical, and each restores through the other. CI checks that on every push, over a database holding every value type TypeDB has.Answers have no ceiling, and reads can stream.
answer_count_limitexists only in the HTTP API.TypeDB.GRPC.stream/4hands the answer to the caller as it arrives and asks the server for the next batch only when the consumer wants it: 50 000 rows in 753 ms retaining nothing, against 1439 ms and 80 MiB collected.Enum.take(5)over them costs one batch.Reads pipeline. Requests are correlated by
req_id, so several are in flight at once: 200 reads sent together answer in 47 ms. Writes cannot be — TypeDB aborts a write's answer stream when the next write in the same transaction starts, withTSV13— andTransaction.query_many/3returns that failure rather than committing work the server reported as failed.
Why not this transport
- Many small independent queries are slower. The protocol has no one-shot query, so 200 independent point reads take 249 ms here against 213 ms over HTTP. That is the shape a request-serving web application has.
- Hard dependencies.
grpc,protobuf,gunand their transitive dependencies, againsttypedb's single optional one. - HTTP/2 end to end. Anything between the application and TypeDB has to speak it.
The rest of the surface
Databases, users, transactions, analyze/3, include_query_structure,
connection_open with the protocol-version check the server performs itself,
server and cluster listings, telemetry under the same event names as the
sibling with a :transport tag, and a ! twin for every failing function —
enforced mechanically, as in the sibling.
TLS is off by default, matching TypeDB CE, and url: "https://…" turns it
on. With TLS on, certificates are verified against this machine's trust store
unless :tls_root_ca names a private CA; the driver says so once, at start-up,
when it is about to send credentials in clear text to a server that is not on
this machine.
There is deliberately no on_close callback: a transaction is a process, so
Process.monitor(tx.pid) does the same and more, and
TypeDB.GRPC.Transaction's documentation explains why it is the better answer.
Known limits
- No cluster support. One address, no failover, no routing. TypeDB CE is single-node and the machinery cannot be tested against it, which is the argument for not shipping it untested.
Value::Structdecodes to{:struct, type_name}— the type's name and not its fields. The protocol carries only the name. Rust returns an error here, so this is ahead rather than behind.- Raising
:prefetch_sizemakes a streamed read slower, not faster: the server produces the whole batch before sending any of it. Measured, and documented where the option is.
Provenance
Two audits before the first release — Audit V of this package and Audit VI of
both — are in the repository's AUDIT.md, findings, measurements and one
withdrawn finding included.