| --- |
| layout: page |
| title: Road Map |
| --- |
| |
| # Road Map |
| |
| This is a list of big ideas we'd like to implement in Cap'n Proto. We don't know in what order |
| these will actually happen; as always, real work is driven by real-world needs. |
| |
| ## Language Features |
| |
| * **Inline lists:** Lets you define a field composed of a fixed number of elements of the same |
| type, and have those elements be stored directly within the struct rather than as a separate |
| object. Useful mainly to avoid the need to validate list lengths when the length should always |
| be the same. Also saves a pointer's worth of space. |
| * **Type aliases:** Ability to define a type which is just an alias of some other type, and |
| have it show up as e.g. a `typedef` in languages that support that. (The current `using` |
| keyword is intended only for local use and does not affect code generation.) |
| * **Doc comments:** Harvest doc comments from schema files and use them to generate doc comments |
| on generated code. Also make them available in the compiled schema so that a documentation |
| generator could use them. |
| * **Encapsulated types:** This will allow you to create a hand-written wrapper around a |
| type which will be automatically injected into the generated code, so that you can provide a |
| nicer interface which encapsulates the type's inner state. |
| * **Maps:** Based on encapsulated and parameterized types. |
| |
| ## RPC Protocol Features |
| |
| * **Dynamic schema transmission:** Allow e.g. Python applications to obtain schemas directly from |
| the RPC server so that they need not have a local copy. Great for interactive debugging. |
| * **Three-way introductions (level 3 RPC):** Allow RPC interactions between more than two parties, |
| with new connections formed automatically as needed. |
| * **Bulk and Realtime**: Add features that make it easier to design Cap'n Proto APIs for bulk |
| data transfers (with flow control) and realtime communications (where it's better to drop |
| messages than to deliver them late). |
| * **UDP transport**: Cap'n Proto RPC could benefit from implementing a UDP transport, in order |
| to achieve zero-round-trip three-party introductions and to implement "realtime" APIs (see |
| "bulk and realtime", above). |
| * **Encrypted transport**: Cap'n Proto RPC should support an encrypted transport which uses |
| capability-based authorization (not PKI), can accomplish zero-round-trip three-party |
| introductions (via a pre-shared key from the introducer) and based on modern crypto. TLS is |
| not designed for this, but we don't want to invent new crypto; we intend to build on |
| [libsodium](https://github.com/jedisct1/libsodium) and the |
| [Noise Protocol Framework](http://noiseprotocol.org/) as much as possible. |
| |
| ## C++ Cap'n Proto API Features |
| |
| * **Plain Old C Structs:** The code generator should also generate a POCS type corresponding |
| to each struct type. The POCS type would use traditional memory allocation, thus would not |
| support zero-copy, but would support a more traditional and easy-to-use C++ API, including |
| the ability to mutate the object over time without convoluted memory management. POCS types |
| could be extracted from and inserted into messages with a single copy, allowing them to be |
| used easily in non-performance-critical code. |
| * **Multi-threading:** It should be made easy to assign different Cap'n Proto RPC objects |
| to different threads and have them be able to safely call each other. Each thread would still |
| have an anyschronous event loop serving the objects that belong to it. |
| * **Shared memory RPC:** Zero-copy inter-process communication. |
| * **JSON codec customization:** Extend the JSON library to support customizing the JSON |
| representation using annotations. For example, a field could be given a different name in |
| JSON than it is in Cap'n Proto. The goal of these features would be to allow any reasonable |
| pre-existing JSON schema to be representable as a Cap'n Proto type definition, so that |
| servers implementing JSON APIs can use Cap'n Proto exclusively on the server side. |
| * **LZ4 integration:** Integrate LZ4 compression into the API to further reduce bandwidth needs |
| with minimal CPU overhead. |
| * **Annotations API:** For each annotation definition, generate code which assists in extracting |
| that annotation from schema objects in a type-safe way. |
| |
| ## C++ KJ API Features |
| |
| KJ is a framework library that is bundled with Cap'n Proto, but is broadly applicable to C++ |
| applications even if they don't use Cap'n Proto serialization. |
| |
| * **Fiber-based concurrency:** The C++ runtime's event loop concurrency model will be augmented |
| with support for fibers, which are like threads except that context switches happen only at |
| well-defined points (thus avoiding the need for mutex locking). Fibers essentially provide |
| syntax sugar on top of the event loop model. |
| * **TLS bindings:** Write bindings for e.g. OpenSSL to make it easy to integrate with the KJ |
| I/O framework, Cap'n Proto RPC, and the KJ HTTP library. |
| * **Modern crypto bindings:** A thin wrapper around |
| [libsodium](https://github.com/jedisct1/libsodium) with a nice C++ API, e.g. representing |
| keys using fixed-size, trivially-copyable classes. |
| * **Event loop integrations:** We should provide off-the-shelf integrations with popular event |
| loop libraries, such as libuv, libev, libevent, boost::asio, and others, so that it's easier |
| to use Cap'n Proto RPC in applications that already use another event framework. |
| |
| ## Storage |
| |
| * **ORM interface:** Define a standard interface for capabilities that represent remotely-stored |
| objects, with get, put, publish, and subscribe methods. Ideally, parameterize this interface |
| on the stored type. |
| * **mmap-friendly mutable storage format:** Define a standard storage format that is friendly |
| to mmap-based use while allowing modification. (With the current serialization format, mmap |
| is only useful for read-only structures.) Possibly based on the ORM interface, updates only |
| possible at the granularity of a whole ORM entry. |
| |
| ## Tools |
| |
| * **Schema compatibility checker:** Add a `capnp` command which, given two schemas, verifies |
| that the latter is a compatible upgrade from the former. This could be used as a git hook |
| to prevent submission of schema changes that would break wire compatibility. |
| * **RPC debugger:** Add a `capnp` command which sends an RPC from the command line and prints |
| the result. Useful for debugging RPC servers. |
| |
| ## Quality Assurance |
| |
| These things absolutely must happen before any 1.0 release. Note that it's not yet decided when |
| a 1.0 release would happen nor how many 0.x releases might precede it. |
| |
| * **Expand test coverage:** There are lots of tests now, but some important scenarios, such as |
| handling invalid of invalid input, need better testing. |
| * **Performance review:** Performance is already very good compared to competitors, but at some |
| point we need to break out the profiler and really hone down on the details. |
| * **Security review:** We need a careful security review to make sure malicious input cannot |
| crash an application or corrupt memory. |
| |
| ## Infrastructure |
| |
| Note: These are very large projects. |
| |
| * **JSON-HTTP proxy:** Develop a web server which can expose a Cap'n Proto RPC backend as a |
| JSON-over-HTTP protocol. |
| * **Database:** A fast storage database based on Cap'n Proto which implements the ORM interface |
| on top of the mmap storage format. |