https://github.com/p14n/vertx-ring
A clojure ring adapter for Eclipse Vert.x 5
https://github.com/p14n/vertx-ring
clojure ring vertx
Last synced: 2 months ago
JSON representation
A clojure ring adapter for Eclipse Vert.x 5
- Host: GitHub
- URL: https://github.com/p14n/vertx-ring
- Owner: p14n
- Created: 2025-09-18T21:48:40.000Z (9 months ago)
- Default Branch: main
- Last Pushed: 2025-10-05T08:06:58.000Z (9 months ago)
- Last Synced: 2025-10-05T10:12:32.746Z (9 months ago)
- Topics: clojure, ring, vertx
- Language: Clojure
- Homepage:
- Size: 499 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# vertx-ring
[](https://github.com/p14n/vertx-ring/actions/workflows/clojure.yml)
A Ring adapter for Eclipse Vert.x 5, providing a bridge between Clojure's Ring specification and Vert.x's reactive HTTP server.
## Overview
This library allows you to run Ring applications on Vert.x, taking advantage of Vert.x's high-performance, reactive, and non-blocking I/O capabilities while maintaining compatibility with the Ring ecosystem.
## Features
- Ring-compliant request/response handling
- Asynchronous request processing
- Integration with Vert.x's event loop
- Support for Ring middleware
- Configurable server options
## Ring Specification
This adapter implements the [Ring SPEC](https://github.com/ring-clojure/ring/blob/master/SPEC.md), providing:
- **Request Map**: HTTP requests are converted to Clojure maps with standard Ring keys
- **Response Map**: Ring response maps are converted back to HTTP responses
- **Handler Function**: Standard Ring handler function interface
- **Middleware Support**: Compatible with existing Ring middleware
## Dependencies
- Clojure 1.12.0+
- Vert.x Core 5.0.4
- Ring Core 1.13.0
## Usage
### Basic Usage
#### Async (default)
```clojure
(require '[com.p14n.vertx-ring.adapter :as adapter])
(defn handler [request respond raise]
(respond {:status 200
:headers {"Content-Type" "text/plain"}
:body "Hello, World!"}))
(adapter/run-server handler {:port 8080})
```
#### Sync (requires java.util.concurrent.ExecutorService)
```clojure
(require '[com.p14n.vertx-ring.adapter :as adapter])
(import '[java.util.concurrent Executors])
(defn handler [request]
{:status 200
:headers {"Content-Type" "text/plain"}
:body "Hello, World!"})
(adapter/run-server handler {:port 8080
:executor (Executors/newCachedThreadPool)})
```
### Advanced Configuration
For more control over Vert.x behavior, you can use the options helpers:
```clojure
(require '[com.p14n.vertx-ring.adapter :as adapter]
'[com.p14n.vertx-ring.options :as options])
(defn handler [request respond raise]
(respond {:status 200
:headers {"Content-Type" "text/plain"}
:body "Hello, World!"}))
;; Configure Vert.x options
(def vertx-opts (options/map->vertx-options
{:event-loop-pool-size 4
:worker-pool-size 20
:prefer-native-transport true}))
;; Configure HTTP server options
(def server-opts (options/map->http-server-options
{:port 8080
:host "0.0.0.0"
:compression-supported true
:tcp-keep-alive true
:idle-timeout 30}))
(adapter/run-server handler {:vertx-options vertx-opts
:server-options server-opts})
```
### Configuration Options
#### Vert.x Options
- `:event-loop-pool-size` - Number of event loop threads
- `:worker-pool-size` - Number of worker threads
- `:prefer-native-transport` - Use native transport when available
- `:ha-enabled` - Enable high availability
- `:blocked-thread-check-interval` - Thread blocking check interval
#### HTTP Server Options
- `:port` - Server port (default 8080)
- `:host` - Server host (default "localhost")
- `:compression-supported` - Enable HTTP compression
- `:tcp-keep-alive` - Enable TCP keep-alive
- `:ssl` - Enable SSL/TLS
- `:idle-timeout` - Connection idle timeout
- `:max-websocket-frame-size` - Maximum WebSocket frame size
## Quick Start
1. Clone this repository
2. Start a REPL: `clj -M:dev`
3. In the REPL:
```clojure
(require 'user)
(user/start) ; Starts server on port 8080
```
4. Test with curl: `curl http://localhost:8080/`
5. Stop the server: `(user/stop)`
## Examples
See the `examples/` directory for more usage examples.
## Building
Build a JAR:
```bash
clj -T:build jar
```
## Testing
Run tests:
```bash
clj -M:test
```
## Development
This project uses Clojure CLI tools with deps.edn.
### REPL
```bash
clj -M:repl
```
### Testing
```bash
clj -M:test
```
## License
Copyright © 2025
Distributed under the Eclipse Public License either version 1.0 or (at your option) any later version.