I’ve been working on this project for the last year for use at https://www.hockeystack.com/. It started out of frustration with how CPU-heavy gzip/deflate are in the official ClickHouse JS client once you start scaling up inserts. From there it evolved into a completionist desire to make the best ClickHouse client implementation I possibly could.
Highlights: * ZSTD/LZ4 support in browsers over HTTP and in Node/Bun/Deno over HTTP or TCP * An aggressively fuzzed Native-format implementation * Supports all types + container types at arbitrary levels of nesting, including Variant, Dynamic, JSON, Nested, and Tuple * CI round-trips ClickHouse’s own generateRandom and generateRandomStructure and I’ve got a separate fuzzing implementation which includes JSON, Variant and Dynamic * The parser is synchronous and resumable internally. The async wrapper buffers blocks and fetches more data whenever there isn’t enough available to parse a column. * A fully functional TCP client for Node/Bun/Deno * Supports ProfileEvents, logs, progress, and the other protocol packet types * Supports [external tables](https://clickhouse.com/docs/engines/table-engines/special/ex...) * Supports [native query params](https://clickhouse.com/docs/sql-reference/syntax#defining-an...)
A secondary motivation is for this to serve as a decent reference implementation in a relatively high-level—albeit kinda shitty—language. In theory, someone could point an LLM at it and use /goal or whatever to get a usable implementation in another language.
Hope it proves useful to folks!