dependencies
| (this space intentionally left almost blank) | ||||||||||||
(ns vertx-clj.core (:import (org.vertx.java.core Vertx Handler AsyncResultHandler) (org.vertx.java.core.http HttpServerRequest RouteMatcher) (org.vertx.java.core.streams Pump) (clojure.lang ArityException)) (:require [clojure.string :as s]) (:use vertx-clj.utils)) | |||||||||||||
Converts a string to UpperCamelCase. | (defn- camelize [x] (s/join (map s/capitalize (s/split x #"-")))) | ||||||||||||
Deploy a module programmatically. Please see the modules manual for more information about modules. | (defn deploy-module ([module-name conf] (fn [vertx# container#] (.deployModule container# module-name (json conf)))) ([module-name conf instances] (.deployModule container# module-name (json conf) instances)) ([module-name conf instances done-handler] (fn [vertx# container#] (.deployModule container# module-name (json conf) instances done-handler))) ) | ||||||||||||
(defmacro run-verticles [& verts] `(fn [_# container#] (doseq [v# (list ~@verts)] (doseq [name# (vals (ns-interns v#))] (when-let [verticle# (:verticle (meta name#))] (.deployVerticle container# verticle#)))))) | |||||||||||||
Define a vertx verticle:
As in a java verticle, vertx and container is available for the body. The name is used to generate the Verticle, e.g. the previous verticle
will generate a HttpServer.class file in your project :compile-path, which can be
run as | (defmacro defverticle [vert body] (let [this (gensym "this") prefix (gensym "prefix-") vert-class (-> vert str camelize)] `(do (defn ~(vary-meta (symbol (str prefix "start")) assoc :verticle vert-class) [~this] (let [vertx# (.getVertx ~this) container# (.getContainer ~this)] (~body vertx# container#))) (gen-class :name ~vert-class :extends org.vertx.java.deploy.Verticle :prefix ~(str prefix))))) | ||||||||||||
Syntax sugar to create a
| (defmacro handler [expr & body] `(proxy [Handler] [] (handle ~expr ~@body))) | ||||||||||||
Take a list of verticles and deploy them programmatically. | (defmacro deploy-verticles [& args] `(defverticle ~(gensym "container") (run-verticles ~@args))) | ||||||||||||
Create a handler and attach it the | (defmacro data-handler [sock expr & body] `(.dataHandler ~sock (handler ~expr ~@body))) | ||||||||||||
The same as | (defmacro frame-handler [sock expr & body] `(.dataHandler ~sock (RecordParser/newDelimited "\n" (handler ~expr ~@body)))) | ||||||||||||
Create a Pump on the passed two sockets, takes an optional parameter for whether start the pump immediately, Default false. | (defn pump ([sock1 sock2] (Pump/createPump sock1 sock2)) ([sock1 sock2 start] (if start (.start (pump sock1 sock2)) (pump sock1 sock2)))) | ||||||||||||
(ns vertx-clj.file (:use vertx-clj.core) (:import [org.vertx.java.core AsyncResultHandler])) | |||||||||||||
(defn open-file [vertx filename handler] (-> vertx .fileSystem (.open filename handler))) | |||||||||||||
(defn close-file [f callback] (.close f callback)) | |||||||||||||
(defmacro async-result-handler [expr & body] "Create a ```AsyncResultHandler```" `(proxy [AsyncResultHandler] [] (handle ~expr ~@body))) | |||||||||||||
(ns vertx-clj.http (:use vertx-clj.core) (:import [org.vertx.java.core.http RouteMatcher HttpServerRequest] [org.vertx.java.core Handler])) | |||||||||||||
Create a HttpClient instance. | (defmacro http-connect [port host & body] `(fn [vertx# _#] (let [http-client# (.createHttpClient vertx#)] (doto http-client# (.setPort ~port) (.setHost ~host)) ((fn [~'vertx ~'client] ~@body) vertx# http-client#)))) | ||||||||||||
Create a HttpServer instance that listens on the specified port and host. instance of Vertx and HttpServer is available in the body as vertx and http-server. | (defmacro http-listen [port host & body] `(fn [vertx# _#] (let [http-server# (.createHttpServer vertx#)] ((fn [~'vertx ~'http-server] ~@body) vertx# http-server#) (.listen http-server# ~port ~host)))) | ||||||||||||
Sinatra like route matching by | (defmacro http-route [port host & body] `(fn [vertx# container#] (let [http# (.createHttpServer vertx#) router# (RouteMatcher.)] ((fn [~'router] ~@body) router#) (-> http# (.requestHandler router#) (.listen ~port ~host))))) | ||||||||||||
Create a handler for websocket request. | (defmacro ws-handler [http-server expr & body] `(.websocketHandler ~http-server (handler ~expr ~@body))) | ||||||||||||
Create a handler for http request. | (defmacro req-handler [http-server expr & body] `(.requestHandler ~http-server (handler ~expr ~@body))) | ||||||||||||
Retrieve the value associated with the key from request parameters. | (defn params [^HttpServerRequest req key] (-> req .params (.get key))) | ||||||||||||
Get the headers of the request. | (defn headers [^HttpServerRequest req] (.headers req)) | ||||||||||||
Send a get request and block before the body returned. | (defmacro get-now [client path & body] `(.getNow ~client ~path (proxy [Handler] [] (handle [resp#] (.bodyHandler resp# (proxy [Handler] [] (handle [data#] ((fn [~'buf] ~@body) data#)))))))) | ||||||||||||
Syntax sugar for ending request. | (defn end-req ([req buf] (.end (.response req) buf)) ([req] (.end (.response req)))) | ||||||||||||
Handler for request end event. | (defn end-handler [req callback] (.endHandler req callback)) | ||||||||||||
Http SendFile. | (defn send-file [req & paths] (.sendFile (.response req) (apply str paths))) | ||||||||||||
(ns vertx-clj.net (:use vertx-clj.core)) | |||||||||||||
Create a | (defmacro sock-listen [port host & body] `(fn [vertx# _#] (let [sock-server# (.createNetServer vertx#)] ((fn [~'vertx ~'sock-server] ~@body) vertx# sock-server#) (.listen sock-server# ~port ~host)))) | ||||||||||||
Create a | (defmacro sock-connect [port host body] `(fn [vertx# container#] (let [client# (.createNetClient vertx#)] (.connect client# ~port ~host ~body)))) | ||||||||||||
Used by a | (defmacro connect-handler [sock-server expr & body] `(.connectHandler ~sock-server (handler ~expr ~@body))) | ||||||||||||
Used by a | (defmacro closed-handler [sock expr & body] `(.closedHandler ~sock (handler ~expr ~@body))) | ||||||||||||
(ns vertx-clj.route-matcher (:refer-clojure :exclude [get]) (:import [org.vertx.java.core Handler] [org.vertx.java.core.http RouteMatcher])) | |||||||||||||
Helper methods for | |||||||||||||
(defn get [^RouteMatcher router path req-fn] (.get router path (proxy [Handler] [] (handle [req] (req-fn req))))) | |||||||||||||
(defn get-with-regexp [^RouteMatcher router path req-fn] (.getWithRegEx router path (proxy [Handler] [] (handle [req] (req-fn req))))) | |||||||||||||
(ns vertx-clj.sockjs (:import [org.vertx.java.core.json JsonObject JsonArray]) (:use vertx-clj.utils)) | |||||||||||||
Helper methods for | |||||||||||||
(declare bound-obj prefix) | |||||||||||||
Setting up handlers for requests from sockjs client. | (defn install-app [sockjs-server pfx handler] (.installApp sockjs-server (prefix pfx) handler)) | ||||||||||||
Setting up SockJS EventBus bridge. | (defn bridge [sockjs-server pfx inbound outbound] (let [in-permitted (bound-obj inbound) out-permitted (bound-obj outbound) eb-prefix (prefix pfx)] (.bridge sockjs-server eb-prefix in-permitted out-permitted))) | ||||||||||||
(defn- ^JsonArray bound-obj [clj-map] (-> (JsonArray.) (.add (json clj-map)))) | |||||||||||||
(defn- ^JsonObject prefix [s] (-> (JsonObject.) (.putString "prefix" s))) | |||||||||||||
(ns vertx-clj.utils (:import [org.vertx.java.core.json JsonObject])) | |||||||||||||
Convert a map to | (defn ^JsonObject json [clj-map] (let [ret (JsonObject.)] (doseq [[k v] clj-map] (.putString ret (name k) (str v))) ret)) | ||||||||||||