From 4c430cedf5f2cfc5b45a8f17b9f89385363ad74c Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Thu, 19 Aug 2021 14:17:51 +0200 Subject: [PATCH] :recycle: Refactor exporter browser management. Replace the cluster dependency with generic-pool. --- exporter/deps.edn | 4 +- exporter/package.json | 10 +- exporter/src/app/browser.cljs | 98 ++++++++++----- exporter/src/app/renderer/bitmap.cljs | 34 +++-- exporter/src/app/renderer/pdf.cljs | 26 ++-- exporter/src/app/renderer/svg.cljs | 27 ++-- exporter/yarn.lock | 173 +++++++++++++------------- 7 files changed, 197 insertions(+), 175 deletions(-) diff --git a/exporter/deps.edn b/exporter/deps.edn index 2d1b03b6c..5c55ace1e 100644 --- a/exporter/deps.edn +++ b/exporter/deps.edn @@ -4,7 +4,7 @@ binaryage/devtools {:mvn/version "RELEASE"} metosin/reitit-core {:mvn/version "0.5.13"} lambdaisland/glogi {:mvn/version "1.0.106"} - funcool/beicon {:mvn/version "2021.04.29-0"} + funcool/beicon {:mvn/version "2021.07.05-1"} } :aliases {:outdated @@ -14,7 +14,7 @@ :dev {:extra-deps - {thheller/shadow-cljs {:mvn/version "2.14.1"}}} + {thheller/shadow-cljs {:mvn/version "2.15.2"}}} :shadow-cljs {:main-opts ["-m" "shadow.cljs.devtools.cli"]} diff --git a/exporter/package.json b/exporter/package.json index a7422dbf4..52cfa2501 100644 --- a/exporter/package.json +++ b/exporter/package.json @@ -9,18 +9,18 @@ "author": "UXBOX LABS SL", "license": "SEE LICENSE IN ", "dependencies": { + "generic-pool": "^3.8.2", "inflation": "^2.0.0", - "jszip": "^3.6.0", + "jszip": "^3.7.0", "koa": "^2.13.0", - "luxon": "^1.27.0", - "puppeteer": "^10.0.0", - "puppeteer-cluster": "^0.22.0", + "luxon": "^2.0.1", + "puppeteer-core": "^10.1.0", "raw-body": "^2.4.1", "xml-js": "^1.6.11", "xregexp": "^5.0.2" }, "devDependencies": { - "shadow-cljs": "^2.14.2", + "shadow-cljs": "^2.15.2", "source-map-support": "^0.5.19" } } diff --git a/exporter/src/app/browser.cljs b/exporter/src/app/browser.cljs index 9df73c066..d161d1629 100644 --- a/exporter/src/app/browser.cljs +++ b/exporter/src/app/browser.cljs @@ -6,8 +6,10 @@ (ns app.browser (:require - ["puppeteer-cluster" :as ppc] + ["puppeteer-core" :as pp] + ["generic-pool" :as gp] [app.common.data :as d] + [app.common.uuid :as uuid] [app.config :as cf] [lambdaisland.glogi :as log] [promesa.core :as p])) @@ -20,12 +22,6 @@ (str "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 " "(KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36")) -(defn exec! - [browser f] - (.execute ^js browser (fn [props] - (let [page (unchecked-get props "page")] - (f page))))) - (defn set-cookie! [page {:keys [key value domain]}] (.setCookie ^js page #js {:name key @@ -100,36 +96,76 @@ ;; --- BROWSER STATE -(def instance (atom nil)) +(defonce pool (atom nil)) +(defonce pool-browser-id (atom 1)) -(defn- create-browser - [concurrency strategy] - (let [strategy (case strategy - :browser (.-CONCURRENCY_BROWSER ^js ppc/Cluster) - :incognito (.-CONCURRENCY_CONTEXT ^js ppc/Cluster) - :page (.-CONCURRENCY_PAGE ^js ppc/Cluster)) - opts #js {:concurrency strategy - :maxConcurrency concurrency - :puppeteerOptions #js {:args #js ["--no-sandbox"]}}] - (.launch ^js ppc/Cluster opts))) +(def browser-pool-factory + (letfn [(create [] + (let [path (cf/get :browser-executable-path "/usr/bin/google-chrome")] + (-> (pp/launch #js {:executablePath path :args #js ["--no-sandbox"]}) + (p/then (fn [browser] + (let [id (deref pool-browser-id)] + (log/info :origin "factory" :action "create" :browser-id id) + (unchecked-set browser "__num_use" 0) + (unchecked-set browser "__id" id) + (swap! pool-browser-id inc) + browser)))))) + (destroy [obj] + (let [id (unchecked-get obj "__id")] + (log/info :origin "factory" :action "destroy" :browser-id id) + (.close ^js obj))) + (validate [obj] + (let [max-use (cf/get :browser-max-usage 10) + num-use (unchecked-get obj "__num_use") + id (unchecked-get obj "__id")] + + (log/info :origin "factory" :action "validate" :browser-id id :max-use max-use :num-use num-use :obj obj) + (if (> num-use max-use) + (p/resolved false) + (do + (unchecked-set obj "__num_use" (inc num-use)) + (p/resolved (.isConnected ^js obj))))))] + + #js {:create create + :destroy destroy + :validate validate})) (defn init [] - (let [concurrency (cf/get :browser-concurrency) - strategy (cf/get :browser-strategy)] - (-> (create-browser concurrency strategy) - (p/then #(reset! instance %)) - (p/catch (fn [error] - (log/error :msg "failed to initialize browser") - (js/console.error error)))))) + (log/info :msg "initializing browser pool") + (let [opts #js {:max (cf/get :browser-pool-max 3) + :min (cf/get :browser-pool-min 0) + :testOnBorrow true + :evictionRunIntervalMillis 30000 + :numTestsPerEvictionRun 5 + :acquireTimeoutMillis 120000 ; 2min + :idleTimeoutMillis 30000}] + (reset! pool (gp/createPool browser-pool-factory opts)) + (p/resolved nil))) (defn stop [] - (if-let [instance @instance] - (p/do! - (.idle ^js instance) - (.close ^js instance) - (log/info :msg "shutdown headless browser")) - (p/resolved nil))) + (when-let [pool (deref pool)] + (log/info :msg "finalizing browser pool") + (-> (.drain ^js pool) + (p/then (fn [] (.clear ^js pool)))))) + +(defn exec! + [f] + (letfn [(on-acquire [pool browser] + (p/let [ctx (.createIncognitoBrowserContext ^js browser) + page (.newPage ^js ctx)] + (-> (p/do! (f page)) + (p/handle + (fn [result error] + (-> (p/do! (.close ^js ctx) + (.release ^js pool browser)) + (p/handle (fn [_ _] + (if result + (p/resolved result) + (p/rejected error))))))))))] + (when-let [pool (deref pool)] + (-> (.acquire ^js pool) + (p/then (partial on-acquire pool)))))) diff --git a/exporter/src/app/renderer/bitmap.cljs b/exporter/src/app/renderer/bitmap.cljs index d80d53ab6..c900a0862 100644 --- a/exporter/src/app/renderer/bitmap.cljs +++ b/exporter/src/app/renderer/bitmap.cljs @@ -29,7 +29,7 @@ :value token})) (defn screenshot-object - [browser {:keys [file-id page-id object-id token scale type]}] + [{: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)) @@ -55,7 +55,7 @@ :png (bw/screenshot dom {:omit-background? true :type type}) :jpeg (bw/screenshot dom {:omit-background? false :type type}))))))] - (bw/exec! browser handle))) + (bw/exec! handle))) (s/def ::name ::us/string) (s/def ::suffix ::us/string) @@ -74,22 +74,16 @@ (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")}))) + (p/let [content (screenshot-object 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")})) diff --git a/exporter/src/app/renderer/pdf.cljs b/exporter/src/app/renderer/pdf.cljs index 56efd4e46..d57729b86 100644 --- a/exporter/src/app/renderer/pdf.cljs +++ b/exporter/src/app/renderer/pdf.cljs @@ -26,7 +26,7 @@ :value token})) (defn pdf-from-object - [browser {:keys [file-id page-id object-id token scale type]}] + [{: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)) @@ -44,7 +44,7 @@ (bw/wait-for page "#screenshot") (bw/pdf page))))] - (bw/exec! browser handle))) + (bw/exec! handle))) (s/def ::name ::us/string) (s/def ::suffix ::us/string) @@ -62,18 +62,12 @@ (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 (pdf-from-object browser params)] - {:content content - :filename (or (:filename params) - (str (:name params) - (:suffix params "") - ".pdf")) - :length (alength content) - :mime-type "application/pdf"}))) + (p/let [content (pdf-from-object params)] + {:content content + :filename (or (:filename params) + (str (:name params) + (:suffix params "") + ".pdf")) + :length (alength content) + :mime-type "application/pdf"})) diff --git a/exporter/src/app/renderer/svg.cljs b/exporter/src/app/renderer/svg.cljs index 64f298ca0..93e0649f4 100644 --- a/exporter/src/app/renderer/svg.cljs +++ b/exporter/src/app/renderer/svg.cljs @@ -114,7 +114,7 @@ (defn- render-object - [browser {:keys [page-id file-id object-id token scale suffix type]}] + [{:keys [page-id file-id object-id token scale suffix type]}] (letfn [(convert-to-ppm [pngpath] (log/trace :fn :convert-to-ppm) (let [basepath (path/dirname pngpath) @@ -279,7 +279,7 @@ rctx {:cookie cookie :uri (str uri)}] (log/info :uri (:uri rctx)) - (bw/exec! browser (partial handle rctx))))) + (bw/exec! (partial handle rctx))))) (s/def ::name ::us/string) (s/def ::suffix ::us/string) @@ -298,18 +298,11 @@ (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 (render-object browser params)] - {:content content - :filename (or (:filename params) - (str (:name params) - (:suffix params "") - ".svg")) - :length (alength content) - :mime-type "image/svg+xml"}))) + (p/let [content (render-object params)] + {:content content + :filename (or (:filename params) + (str (:name params) + (:suffix params "") + ".svg")) + :length (alength content) + :mime-type "image/svg+xml"})) diff --git a/exporter/yarn.lock b/exporter/yarn.lock index e381d7f92..62e1b751b 100644 --- a/exporter/yarn.lock +++ b/exporter/yarn.lock @@ -2,23 +2,23 @@ # yarn lockfile v1 -"@babel/runtime-corejs3@^7.12.1": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.14.0.tgz#6bf5fbc0b961f8e3202888cb2cd0fb7a0a9a3f66" - integrity sha512-0R0HTZWHLk6G8jIk0FtoX+AatCtKnswS98VhXwGImFc759PJRp4Tru0PQYZofyijTFUr+gT8Mu7sgXVJLQ0ceg== +"@babel/runtime-corejs3@^7.14.9": + version "7.15.3" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.15.3.tgz#28754263988198f2a928c09733ade2fb4d28089d" + integrity sha512-30A3lP+sRL6ml8uhoJSs+8jwpKzbw8CqBvDc1laeptxPm5FahumJxirigcbD2qTs71Sonvj1cyZB0OKGAmxQ+A== dependencies: - core-js-pure "^3.0.0" + core-js-pure "^3.16.0" regenerator-runtime "^0.13.4" "@types/node@*": - version "15.6.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-15.6.2.tgz#c61d49f38af70da32424b5322eee21f97e627175" - integrity sha512-dxcOx8801kMo3KlU+C+/ctWrzREAH7YvoF3aoVpRdqgs+Kf7flp+PJDN/EX5bME3suDUZHsxes9hpvBmzYlWbA== + version "16.6.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.6.2.tgz#331b7b9f8621c638284787c5559423822fdffc50" + integrity sha512-LSw8TZt12ZudbpHc6EkIyDM3nHVWKYrAvGy6EAJfNfjusbwnThqjqxUKKRwuV3iWYeW/LYMzNgaq3MaLffQ2xA== "@types/yauzl@^2.9.1": - version "2.9.1" - resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.9.1.tgz#d10f69f9f522eef3cf98e30afb684a1e1ec923af" - integrity sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA== + version "2.9.2" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.9.2.tgz#c48e5d56aff1444409e39fa164b0b4d4552a7b7a" + integrity sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA== dependencies: "@types/node" "*" @@ -60,11 +60,6 @@ assert@^1.1.1: object-assign "^4.1.1" util "0.10.3" -async-limiter@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" - integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== - balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -174,9 +169,9 @@ buffer-crc32@~0.2.3: integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= buffer-from@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== buffer-xor@^1.0.3: version "1.0.3" @@ -271,10 +266,10 @@ cookies@~0.8.0: depd "~2.0.0" keygrip "~1.1.0" -core-js-pure@^3.0.0: - version "3.13.1" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.13.1.tgz#5d139d346780f015f67225f45ee2362a6bed6ba1" - integrity sha512-wVlh0IAi2t1iOEh16y4u1TRk6ubd4KvLE8dlMi+3QUI6SfKphQUh7tAwihGGSQ8affxEXpVIPpOdf9kjR4v4Pw== +core-js-pure@^3.16.0: + version "3.16.2" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.16.2.tgz#0ef4b79cabafb251ea86eb7d139b42bd98c533e8" + integrity sha512-oxKe64UH049mJqrKkynWp6Vu0Rlm/BTXO/bJZuN2mmR3RtOFNepLlSWDd1eo16PzHpQAoNG97rLU1V/YxesJjw== core-util-is@~1.0.0: version "1.0.2" @@ -329,7 +324,14 @@ crypto-browserify@^3.11.0: randombytes "^2.0.0" randomfill "^1.0.3" -debug@4, debug@4.3.1, debug@^4.1.1: +debug@4, debug@^4.1.1: + version "4.3.2" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" + integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== + dependencies: + ms "2.1.2" + +debug@4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== @@ -376,10 +378,10 @@ destroy@^1.0.4: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= -devtools-protocol@0.0.883894: - version "0.0.883894" - resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.883894.tgz#d403f2c75cd6d71c916aee8dde9258da988a4da9" - integrity sha512-33idhm54QJzf3Q7QofMgCvIVSd2o9H3kQPWaKT/fhoZh+digc+WSiMhbkeG3iN79WY4Hwr9G05NpbhEVrsOYAg== +devtools-protocol@0.0.901419: + version "0.0.901419" + resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.901419.tgz#79b5459c48fe7e1c5563c02bd72f8fec3e0cebcd" + integrity sha512-4INMPwNm9XRpBukhNbF7OB6fNTTCaI8pzy/fXg0xQzAy5h3zL1P8xT3QazgKqBrb/hAYwIBizqDBZ7GtJE74QQ== diffie-hellman@^5.0.0: version "5.0.3" @@ -484,6 +486,11 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= +generic-pool@^3.8.2: + version "3.8.2" + resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-3.8.2.tgz#aab4f280adb522fdfbdc5e5b64d718d3683f04e9" + integrity sha512-nGToKy6p3PAbYQ7p1UlWl6vSPwfwU6TMSWK7TTu+WUY4ZjyZQGniGGt2oNVvyNSpyZYSB43zMXVLcBm08MTMkg== + get-stream@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" @@ -503,6 +510,18 @@ glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" +has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + hash-base@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" @@ -618,9 +637,11 @@ inherits@2.0.3: integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= is-generator-function@^1.0.7: - version "1.0.9" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.9.tgz#e5f82c2323673e7fcad3d12858c83c4039f6399c" - integrity sha512-ZJ34p1uvIfptHCN7sFTjGibB9/oBg17sHqzDLfuwhvmN/qLVvIQXRQ8licZQ35WJ8KuEQt/etnnzQFI9C9Ue/A== + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" @@ -632,10 +653,10 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= -jszip@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.6.0.tgz#839b72812e3f97819cc13ac4134ffced95dd6af9" - integrity sha512-jgnQoG9LKnWO3mnVNBnfhkh0QknICd1FGSrXcgrl67zioyJ4wgx25o9ZqwNtrROSflGBCGYnJfjrIyRIby1OoQ== +jszip@^3.7.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.7.1.tgz#bd63401221c15625a1228c556ca8a68da6fda3d9" + integrity sha512-ghL0tz1XG9ZEmRMcEN2vt7xabrDdqHHeykgARpmZ0BiIctWxM47Vt63ZO2dnp4QYt/xJVLLy5Zv1l/xRdh2byg== dependencies: lie "~3.3.0" pako "~1.0.2" @@ -712,10 +733,10 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" -luxon@^1.27.0: - version "1.27.0" - resolved "https://registry.yarnpkg.com/luxon/-/luxon-1.27.0.tgz#ae10c69113d85dab8f15f5e8390d0cbeddf4f00f" - integrity sha512-VKsFsPggTA0DvnxtJdiExAucKdAnwbCCNlMM5ENvHlxubqWd0xhZcdb4XgZ7QFNhaRhilXCFxHuoObP5BNA4PA== +luxon@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/luxon/-/luxon-2.0.2.tgz#11f2cd4a11655fdf92e076b5782d7ede5bcdd133" + integrity sha512-ZRioYLCgRHrtTORaZX1mx+jtxKtKuI5ZDvHNAmqpUzGqSrR+tL4FVLn/CUGMA3h0+AKD1MAxGI5GnCqR5txNqg== md5.js@^1.3.4: version "1.3.5" @@ -739,17 +760,17 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.48.0: - version "1.48.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.48.0.tgz#e35b31045dd7eada3aaad537ed88a33afbef2d1d" - integrity sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ== +mime-db@1.49.0: + version "1.49.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.49.0.tgz#f3dfde60c99e9cf3bc9701d687778f537001cbed" + integrity sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA== mime-types@^2.1.18, mime-types@~2.1.24: - version "2.1.31" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.31.tgz#a00d76b74317c61f9c2db2218b8e9f8e9c5c9e6b" - integrity sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg== + version "2.1.32" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.32.tgz#1d00e89e7de7fe02008db61001d9e02852670fd5" + integrity sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A== dependencies: - mime-db "1.48.0" + mime-db "1.49.0" minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" @@ -986,20 +1007,13 @@ punycode@^1.2.4: resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= -puppeteer-cluster@^0.22.0: - version "0.22.0" - resolved "https://registry.yarnpkg.com/puppeteer-cluster/-/puppeteer-cluster-0.22.0.tgz#4ab214671f414f15ad6a94a4b61ed0b4172e86e6" - integrity sha512-hmydtMwfVM+idFIDzS8OXetnujHGre7RY3BGL+3njy9+r8Dcu3VALkZHfuBEPf6byKssTCgzxU1BvLczifXd5w== - dependencies: - debug "^4.1.1" - -puppeteer@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-10.0.0.tgz#1b597c956103e2d989ca17f41ba4693b20a3640c" - integrity sha512-AxHvCb9IWmmP3gMW+epxdj92Gglii+6Z4sb+W+zc2hTTu10HF0yg6hGXot5O74uYkVqG3lfDRLfnRpi6WOwi5A== +puppeteer-core@^10.1.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-10.2.0.tgz#8d6606cf345fc0e421bc0612055579ea53234111" + integrity sha512-c1COxSnfynsE6Mtt+dW0t3TITjF9Ku4dnJbFMDDVhLQuMTYSpz4rkSP37qvzcSo3k02/Ac3GYWk0/ncp6DKZNA== dependencies: debug "4.3.1" - devtools-protocol "0.0.883894" + devtools-protocol "0.0.901419" extract-zip "2.0.1" https-proxy-agent "5.0.0" node-fetch "2.6.1" @@ -1074,9 +1088,9 @@ readline-sync@^1.4.7: integrity sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw== regenerator-runtime@^0.13.4: - version "0.13.7" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" - integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== + version "0.13.9" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== rimraf@3.0.2: version "3.0.2" @@ -1146,17 +1160,17 @@ shadow-cljs-jar@1.3.2: resolved "https://registry.yarnpkg.com/shadow-cljs-jar/-/shadow-cljs-jar-1.3.2.tgz#97273afe1747b6a2311917c1c88d9e243c81957b" integrity sha512-XmeffAZHv8z7451kzeq9oKh8fh278Ak+UIOGGrapyqrFBB773xN8vMQ3O7J7TYLnb9BUwcqadKkmgaq7q6fhZg== -shadow-cljs@^2.14.2: - version "2.14.2" - resolved "https://registry.yarnpkg.com/shadow-cljs/-/shadow-cljs-2.14.2.tgz#dba651ea124028064aea6fa9a390f257cb6eede4" - integrity sha512-ficaYfBAATzJ6OGt/GbIl393+cqLchzNkdTrM2PY4ttbsAOyBfWd39t+PZcYpCqemXjkgfBdZt9DJda7WaHJGA== +shadow-cljs@^2.15.2: + version "2.15.4" + resolved "https://registry.yarnpkg.com/shadow-cljs/-/shadow-cljs-2.15.4.tgz#0d657fc8ab9a02d8980db5c49cb1622e8fc6fa52" + integrity sha512-xn8UsiVpOf2LTsQZLsCa910CcMCYdMRT6STAsgveOEIncC9cunGdqE7cTq69vTmIijVQmzf0A1nALidyzO3Hcw== dependencies: node-libs-browser "^2.2.1" readline-sync "^1.4.7" shadow-cljs-jar "1.3.2" source-map-support "^0.4.15" which "^1.3.1" - ws "^3.0.0" + ws "^7.4.6" source-map-support@^0.4.15: version "0.4.18" @@ -1282,11 +1296,6 @@ type-is@^1.6.16: media-typer "0.3.0" mime-types "~2.1.24" -ultron@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" - integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== - unbzip2-stream@1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz#d156d205e670d8d8c393e1c02ebd506422873f6a" @@ -1354,14 +1363,10 @@ ws@7.4.6: resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== -ws@^3.0.0: - version "3.3.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" - integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA== - dependencies: - async-limiter "~1.0.0" - safe-buffer "~5.1.0" - ultron "~1.1.0" +ws@^7.4.6: + version "7.5.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.3.tgz#160835b63c7d97bfab418fc1b8a9fced2ac01a74" + integrity sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg== xml-js@^1.6.11: version "1.6.11" @@ -1371,11 +1376,11 @@ xml-js@^1.6.11: sax "^1.2.4" xregexp@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-5.0.2.tgz#798aa7757836f39cdbdeeba3daf94d75f7a9dcc1" - integrity sha512-JPNfN40YMNSDxZrahMrmtNH1QqPJp0/qNeEJM2nnOlhcBdfCCjekPYFV2OnwKxwvpEYglH1RBotbpRRaEuCG8Q== + version "5.1.0" + resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-5.1.0.tgz#c87e7ae5ffa5fdc520f898a467dcba02b0d391e9" + integrity sha512-PynwUWtXnSZr8tpQlDPMZfPTyv78EYuA4oI959ukxcQ0a9O/lvndLVKy5wpImzzA26eMxpZmnAXJYiQA13AtWA== dependencies: - "@babel/runtime-corejs3" "^7.12.1" + "@babel/runtime-corejs3" "^7.14.9" xtend@^4.0.0: version "4.0.2"