0
Fork 0
mirror of https://github.com/penpot/penpot.git synced 2025-01-24 15:39:50 -05:00

🎉 Backport to main the blob encoding v3.

Safer approach (uses json instead of custom binary format) than v2.
This commit is contained in:
Andrey Antukh 2021-03-08 13:14:52 +01:00 committed by Andrés Moya
parent 3d043adb03
commit ed3d571793
2 changed files with 38 additions and 4 deletions

View file

@ -12,11 +12,12 @@
[app.common.exceptions :as ex]
[app.config :as cfg]
[app.main :as main]
[app.util.blob :as blob]
[app.util.json :as json]
[app.util.time :as dt]
[app.util.transit :as t]
[app.util.json :as json]
[clojure.java.io :as io]
[clojure.pprint :refer [pprint]]
[clojure.pprint :refer [pprint print-table]]
[clojure.repl :refer :all]
[clojure.spec.alpha :as s]
[clojure.spec.gen.alpha :as sgen]
@ -25,8 +26,7 @@
[clojure.tools.namespace.repl :as repl]
[clojure.walk :refer [macroexpand-all]]
[criterium.core :refer [quick-bench bench with-progress-reporting]]
[integrant.core :as ig]
[taoensso.nippy :as nippy]))
[integrant.core :as ig]))
(repl/disable-reload! (find-ns 'integrant.core))
@ -91,3 +91,10 @@
[]
(stop)
(repl/refresh-all :after 'user/start))
(defn compression-bench
[data]
(print-table
[{:v1 (alength (blob/encode data {:version 1}))
:v2 (alength (blob/encode data {:version 2}))
:v3 (alength (blob/encode data {:version 3}))}]))

View file

@ -28,8 +28,10 @@
(declare decode-v1)
(declare decode-v2)
(declare decode-v3)
(declare encode-v1)
(declare encode-v2)
(declare encode-v3)
(def default-version
(:default-blob-version cfg/config 1))
@ -40,6 +42,7 @@
(case (long version)
1 (encode-v1 data)
2 (encode-v2 data)
3 (encode-v3 data)
(throw (ex-info "unsupported version" {:version version})))))
(defn decode
@ -52,6 +55,7 @@
(case version
1 (decode-v1 data ulen)
2 (decode-v2 data ulen)
3 (decode-v3 data ulen)
(throw (ex-info "unsupported version" {:version version}))))))
;; --- IMPL
@ -100,3 +104,26 @@
(Zstd/decompressByteArray ^bytes udata 0 ulen
^bytes cdata 6 (- (alength cdata) 6))
(n/fast-thaw udata)))
(defn- encode-v3
[data]
(let [data (t/encode data {:type :json})
dlen (alength ^bytes data)
mlen (Zstd/compressBound dlen)
cdata (byte-array mlen)
clen (Zstd/compressByteArray ^bytes cdata 0 mlen
^bytes data 0 dlen
4)]
(with-open [^ByteArrayOutputStream baos (ByteArrayOutputStream. (+ (alength cdata) 2 4))
^DataOutputStream dos (DataOutputStream. baos)]
(.writeShort dos (short 3)) ;; version number
(.writeInt dos (int dlen))
(.write dos ^bytes cdata (int 0) clen)
(.toByteArray baos))))
(defn- decode-v3
[^bytes cdata ^long ulen]
(let [udata (byte-array ulen)]
(Zstd/decompressByteArray ^bytes udata 0 ulen
^bytes cdata 6 (- (alength cdata) 6))
(t/decode udata {:type :json})))