jvican / snailgun

A Nailgun client written in Scala that can compile to native and be used as a JVM library.

Version Matrix

snailgun 🐌 🔫

Build Status Maven Central

Snailgun is a Nailgun client written in Scala that can be used as a library and/or compile to native. Snailgun aims to be a flexible, cross-platform and zero-dependency nailgun client you can embed in any tool.

Motivation

Nailgun is a useful protocol to communicate lightweight, short-lived clients with long-running servers.

Developers have traditionally used Nailgun to communicate native-like clients with services running on the JVM. However, there are many use cases that require JVM clients connect to Nailgun servers and those are currently unsupported.

Snailgun is an alternative implementation to the default Python and C clients of the Nailgun protocol that intends to be extensible, fast and support both JVM and Native clients.

  • It provides a simple API that for any JVM-based programming language.
  • It can be compiled to a Native binary that is 10x faster than the Python client through GraalVM's Native Image.

Snailgun's major use cases are:

  1. You need a client that talks the Nailgun protocol but you need to customize it.
  2. You need to communicate with a Nailgun server implemented in another language.
  3. You need to communicate a JVM client with a Nailgun server on the JVM. For example, if the server cannot be compiled to native or synchronizes concurrent clients.

Usage 🔧

Library

The API is meant to be simple and extensible. The snailgun-core directory that hosts the implementation. The entrypoint is Client and the full protocol implementation is Protocol.

Snailgun is published to Maven Central. Add it to your project with:

libraryDependencies += "me.vican.jorge" %% "snailgun" % "SNAILGUN_VERSION"

where SNAILGUN_VERSION is the latest git tag in this repository.

Binary

You can generate a Snailgun binary by following the steps described in the GraalVM Native Image guide.

To generate a native binary out of this repository, run snailgun-cli/graalvm-native-image:packageBin in a machine that has GraalVM and native-image installed.