diff --git a/project.clj b/project.clj index 4e7c07cea0..a5ee189e10 100644 --- a/project.clj +++ b/project.clj @@ -9,6 +9,7 @@ [figwheel-sidecar "0.5.0-6" :scope "test"] ;; runtime + [com.cognitect/transit-cljs "0.8.237"] [rum "0.6.0" :exclusions [sablono]] [sablono "0.6.2"] [cljsjs/react "0.14.3-0"] diff --git a/src/uxbox/transit.cljs b/src/uxbox/transit.cljs new file mode 100644 index 0000000000..79103c523f --- /dev/null +++ b/src/uxbox/transit.cljs @@ -0,0 +1,48 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) 2016 Andrey Antukh + +(ns uxbox.transit + "A lightweight abstraction for transit serialization." + (:refer-clojure :exclude [do]) + (:require [cognitect.transit :as t] + [uxbox.util.data :refer (parse-int)] + [uxbox.util.datetime :as dt])) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Read/Write Transit handlers +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(def ^:private datetime-write-handler + (reify + Object + (tag [_ v] "m") + (rep [_ v] (dt/format v :offset)) + (stringRep [this v] (str (dt/format v :offset))))) + +(defn- datetime-read-handler + [v] + (dt/datetime (parse-int v))) + +(def ^:privare +read-handlers+ + {"u" uuid + "m" datetime-read-handler}) + +(def ^:privare +write-handlers+ + {js/moment datetime-write-handler}) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Public Api +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defn decode + [data] + (let [r (t/reader :json {:handlers +read-handlers+})] + (t/read r data))) + +(defn encode + [data] + (let [w (t/writer :json {:handlers +write-handlers+})] + (t/write w data)))