From 34e84ee3c810ebc357458e355f6fad65776660ec Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Wed, 10 Dec 2025 13:02:31 +0100 Subject: [PATCH] :bug: Fix incorrect resource lifetime handling on exporter --- exporter/package.json | 1 + exporter/scripts/wait-and-start.sh | 1 - exporter/src/app/handlers/export_shapes.cljs | 4 +-- exporter/src/app/handlers/resources.cljs | 35 +++++++++++++------- exporter/src/app/util/shell.cljs | 3 +- exporter/yarn.lock | 8 +++++ 6 files changed, 36 insertions(+), 16 deletions(-) diff --git a/exporter/package.json b/exporter/package.json index 7422f99a04..455f8df300 100644 --- a/exporter/package.json +++ b/exporter/package.json @@ -21,6 +21,7 @@ "raw-body": "^3.0.1", "source-map-support": "^0.5.21", "svgo": "penpot/svgo#v3.1", + "undici": "^7.16.0", "xml-js": "^1.6.11", "xregexp": "^5.1.2" }, diff --git a/exporter/scripts/wait-and-start.sh b/exporter/scripts/wait-and-start.sh index c3848228dc..f9638eb06d 100755 --- a/exporter/scripts/wait-and-start.sh +++ b/exporter/scripts/wait-and-start.sh @@ -7,5 +7,4 @@ bb -i '(babashka.wait/wait-for-port "localhost" 9630)'; bb -i '(babashka.wait/wait-for-path "target/app.js")'; sleep 2; -export NODE_TLS_REJECT_UNAUTHORIZED=0 exec node target/app.js diff --git a/exporter/src/app/handlers/export_shapes.cljs b/exporter/src/app/handlers/export_shapes.cljs index 82f1d78855..29a92df61e 100644 --- a/exporter/src/app/handlers/export_shapes.cljs +++ b/exporter/src/app/handlers/export_shapes.cljs @@ -107,12 +107,12 @@ :on-progress on-progress) append (fn [{:keys [filename path] :as resource}] - (rsc/add-to-zip! zip path (str/replace filename sanitize-file-regex "_"))) + (rsc/add-to-zip zip path (str/replace filename sanitize-file-regex "_"))) proc (->> exports (map (fn [export] (rd/render export append))) (p/all) - (p/fnly (fn [_] (.finalize zip))) + (p/mcat (fn [_] (rsc/close-zip zip))) (p/fmap (constantly resource)) (p/mcat (partial rsc/upload-resource auth-token)) (p/fmap (fn [resource] diff --git a/exporter/src/app/handlers/resources.cljs b/exporter/src/app/handlers/resources.cljs index 32c968c0fb..8b0a55ba35 100644 --- a/exporter/src/app/handlers/resources.cljs +++ b/exporter/src/app/handlers/resources.cljs @@ -11,6 +11,7 @@ ["node:fs" :as fs] ["node:fs/promises" :as fsp] ["node:path" :as path] + ["undici" :as http] [app.common.exceptions :as ex] [app.common.transit :as t] [app.common.uri :as u] @@ -53,30 +54,40 @@ (.pipe zip out) zip)) -(defn add-to-zip! +(defn add-to-zip [zip path name] (.file ^js zip path #js {:name name})) -(defn close-zip! +(defn close-zip [zip] - (.finalize ^js zip)) + (p/create (fn [resolve] + (.on ^js zip "close" resolve) + (.finalize ^js zip)))) (defn upload-resource [auth-token resource] (->> (fsp/readFile (:path resource)) (p/fmap (fn [buffer] + (js/console.log buffer) (new js/Blob #js [buffer] #js {:type (:mtype resource)}))) (p/mcat (fn [blob] - (let [fdata (new js/FormData) - uri (-> (cf/get :public-uri) - (u/ensure-path-slash) - (u/join "api/management/methods/upload-tempfile") - (str))] + (let [fdata (new http/FormData) + agent (new http/Agent #js {:connect #js {:rejectUnauthorized false}}) + headers #js {"X-Shared-Key" cf/management-key + "Authorization" (str "Bearer " auth-token)} + + request #js {:headers headers + :method "POST" + :body fdata + :dispatcher agent} + uri (-> (cf/get :public-uri) + (u/ensure-path-slash) + (u/join "api/management/methods/upload-tempfile") + (str))] + (.append fdata "content" blob (:filename resource)) - (js/fetch uri #js {:headers #js {"X-Shared-Key" cf/management-key - "Authorization" (str "Bearer " auth-token)} - :method "POST" - :body fdata})))) + (http/fetch uri request)))) + (p/mcat (fn [response] (if (not= (.-status response) 200) (ex/raise :type :internal diff --git a/exporter/src/app/util/shell.cljs b/exporter/src/app/util/shell.cljs index 717ca21073..d52b458501 100644 --- a/exporter/src/app/util/shell.cljs +++ b/exporter/src/app/util/shell.cljs @@ -75,7 +75,8 @@ [path] (->> (.stat fs/promises path) (p/fmap (fn [data] - {:created-at (inst-ms (.-ctime ^js data)) + {:path path + :created-at (inst-ms (.-ctime ^js data)) :size (.-size data)})) (p/merr (fn [_cause] (p/resolved nil))))) diff --git a/exporter/yarn.lock b/exporter/yarn.lock index 7d487e04a7..67c96e0b64 100644 --- a/exporter/yarn.lock +++ b/exporter/yarn.lock @@ -582,6 +582,7 @@ __metadata: raw-body: "npm:^3.0.1" source-map-support: "npm:^0.5.21" svgo: "penpot/svgo#v3.1" + undici: "npm:^7.16.0" ws: "npm:^8.18.3" xml-js: "npm:^1.6.11" xregexp: "npm:^5.1.2" @@ -1513,6 +1514,13 @@ __metadata: languageName: node linkType: hard +"undici@npm:^7.16.0": + version: 7.16.0 + resolution: "undici@npm:7.16.0" + checksum: 10c0/efd867792e9f233facf9efa0a087e2d9c3e4415c0b234061b9b40307ca4fa01d945fee4d43c7b564e1b80e0d519bcc682f9f6e0de13c717146c00a80e2f1fb0f + languageName: node + linkType: hard + "unique-filename@npm:^4.0.0": version: 4.0.0 resolution: "unique-filename@npm:4.0.0"