2021-05-05 09:28:12 +02:00
|
|
|
;; 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) UXBOX Labs SL
|
|
|
|
|
|
|
|
(ns app.renderer.bitmap
|
|
|
|
"A bitmap renderer."
|
|
|
|
(:require
|
|
|
|
[app.browser :as bw]
|
|
|
|
[app.common.data :as d]
|
|
|
|
[app.common.exceptions :as ex :include-macros true]
|
|
|
|
[app.common.pages :as cp]
|
|
|
|
[app.common.spec :as us]
|
|
|
|
[app.config :as cf]
|
|
|
|
[cljs.spec.alpha :as s]
|
|
|
|
[cuerdas.core :as str]
|
|
|
|
[lambdaisland.uri :as u]
|
|
|
|
[lambdaisland.glogi :as log]
|
|
|
|
[promesa.core :as p]))
|
|
|
|
|
|
|
|
(defn create-cookie
|
|
|
|
[uri token]
|
|
|
|
(let [domain (str (:host uri)
|
|
|
|
(when (:port uri)
|
|
|
|
(str ":" (:port uri))))]
|
|
|
|
{:domain domain
|
|
|
|
:key "auth-token"
|
|
|
|
:value token}))
|
|
|
|
|
|
|
|
(defn screenshot-object
|
|
|
|
[browser {:keys [file-id page-id object-id token scale type]}]
|
|
|
|
(letfn [(handle [page]
|
|
|
|
(let [path (str "/render-object/" file-id "/" page-id "/" object-id)
|
|
|
|
uri (-> (u/uri (cf/get :public-uri))
|
|
|
|
(assoc :path "/")
|
|
|
|
(assoc :fragment path))
|
|
|
|
cookie (create-cookie uri token)]
|
|
|
|
(screenshot page (str uri) cookie)))
|
|
|
|
|
|
|
|
(screenshot [page uri cookie]
|
|
|
|
(log/info :uri uri)
|
2021-05-14 14:13:46 +02:00
|
|
|
(let [viewport {:width 1920
|
|
|
|
:height 1080
|
|
|
|
:scale scale}
|
|
|
|
options {:viewport viewport
|
|
|
|
:cookie cookie}]
|
|
|
|
(p/do!
|
|
|
|
(bw/configure-page! page options)
|
|
|
|
(bw/navigate! page uri)
|
|
|
|
(bw/eval! page (js* "() => document.body.style.background = 'transparent'"))
|
|
|
|
(bw/wait-for page "#screenshot")
|
|
|
|
(p/let [dom (bw/select page "#screenshot")]
|
|
|
|
(case type
|
|
|
|
:png (bw/screenshot dom {:omit-background? true :type type})
|
|
|
|
:jpeg (bw/screenshot dom {:omit-background? false :type type}))))))]
|
2021-05-05 09:28:12 +02:00
|
|
|
|
|
|
|
(bw/exec! browser handle)))
|
|
|
|
|
|
|
|
(s/def ::name ::us/string)
|
|
|
|
(s/def ::suffix ::us/string)
|
|
|
|
(s/def ::type #{:jpeg :png})
|
|
|
|
(s/def ::page-id ::us/uuid)
|
|
|
|
(s/def ::file-id ::us/uuid)
|
|
|
|
(s/def ::object-id ::us/uuid)
|
|
|
|
(s/def ::scale ::us/number)
|
|
|
|
(s/def ::token ::us/string)
|
|
|
|
(s/def ::filename ::us/string)
|
|
|
|
|
|
|
|
(s/def ::render-params
|
|
|
|
(s/keys :req-un [::name ::suffix ::type ::object-id ::page-id ::scale ::token ::file-id]
|
|
|
|
:opt-un [::filename]))
|
|
|
|
|
|
|
|
(defn render
|
|
|
|
[params]
|
|
|
|
(us/assert ::render-params params)
|
|
|
|
(let [browser @bw/instance]
|
|
|
|
(when-not browser
|
|
|
|
(ex/raise :type :internal
|
|
|
|
:code :browser-not-ready
|
|
|
|
:hint "browser cluster is not initialized yet"))
|
|
|
|
|
|
|
|
(p/let [content (screenshot-object browser params)]
|
|
|
|
{:content content
|
|
|
|
:filename (or (:filename params)
|
|
|
|
(str (:name params)
|
|
|
|
(:suffix params "")
|
|
|
|
(case (:type params)
|
|
|
|
:png ".png"
|
|
|
|
:jpeg ".jpg")))
|
|
|
|
:length (alength content)
|
|
|
|
:mime-type (case (:type params)
|
|
|
|
:png "image/png"
|
|
|
|
:jpeg "image/jpeg")})))
|
|
|
|
|