🐛 Fix incorrect resource lifetime handling on exporter

This commit is contained in:
Andrey Antukh
2025-12-10 13:02:31 +01:00
parent e8201402a7
commit 34e84ee3c8
6 changed files with 36 additions and 16 deletions

View File

@@ -21,6 +21,7 @@
"raw-body": "^3.0.1", "raw-body": "^3.0.1",
"source-map-support": "^0.5.21", "source-map-support": "^0.5.21",
"svgo": "penpot/svgo#v3.1", "svgo": "penpot/svgo#v3.1",
"undici": "^7.16.0",
"xml-js": "^1.6.11", "xml-js": "^1.6.11",
"xregexp": "^5.1.2" "xregexp": "^5.1.2"
}, },

View File

@@ -7,5 +7,4 @@ bb -i '(babashka.wait/wait-for-port "localhost" 9630)';
bb -i '(babashka.wait/wait-for-path "target/app.js")'; bb -i '(babashka.wait/wait-for-path "target/app.js")';
sleep 2; sleep 2;
export NODE_TLS_REJECT_UNAUTHORIZED=0
exec node target/app.js exec node target/app.js

View File

@@ -107,12 +107,12 @@
:on-progress on-progress) :on-progress on-progress)
append (fn [{:keys [filename path] :as resource}] 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 proc (->> exports
(map (fn [export] (rd/render export append))) (map (fn [export] (rd/render export append)))
(p/all) (p/all)
(p/fnly (fn [_] (.finalize zip))) (p/mcat (fn [_] (rsc/close-zip zip)))
(p/fmap (constantly resource)) (p/fmap (constantly resource))
(p/mcat (partial rsc/upload-resource auth-token)) (p/mcat (partial rsc/upload-resource auth-token))
(p/fmap (fn [resource] (p/fmap (fn [resource]

View File

@@ -11,6 +11,7 @@
["node:fs" :as fs] ["node:fs" :as fs]
["node:fs/promises" :as fsp] ["node:fs/promises" :as fsp]
["node:path" :as path] ["node:path" :as path]
["undici" :as http]
[app.common.exceptions :as ex] [app.common.exceptions :as ex]
[app.common.transit :as t] [app.common.transit :as t]
[app.common.uri :as u] [app.common.uri :as u]
@@ -53,30 +54,40 @@
(.pipe zip out) (.pipe zip out)
zip)) zip))
(defn add-to-zip! (defn add-to-zip
[zip path name] [zip path name]
(.file ^js zip path #js {:name name})) (.file ^js zip path #js {:name name}))
(defn close-zip! (defn close-zip
[zip] [zip]
(.finalize ^js zip)) (p/create (fn [resolve]
(.on ^js zip "close" resolve)
(.finalize ^js zip))))
(defn upload-resource (defn upload-resource
[auth-token resource] [auth-token resource]
(->> (fsp/readFile (:path resource)) (->> (fsp/readFile (:path resource))
(p/fmap (fn [buffer] (p/fmap (fn [buffer]
(js/console.log buffer)
(new js/Blob #js [buffer] #js {:type (:mtype resource)}))) (new js/Blob #js [buffer] #js {:type (:mtype resource)})))
(p/mcat (fn [blob] (p/mcat (fn [blob]
(let [fdata (new js/FormData) (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) uri (-> (cf/get :public-uri)
(u/ensure-path-slash) (u/ensure-path-slash)
(u/join "api/management/methods/upload-tempfile") (u/join "api/management/methods/upload-tempfile")
(str))] (str))]
(.append fdata "content" blob (:filename resource)) (.append fdata "content" blob (:filename resource))
(js/fetch uri #js {:headers #js {"X-Shared-Key" cf/management-key (http/fetch uri request))))
"Authorization" (str "Bearer " auth-token)}
:method "POST"
:body fdata}))))
(p/mcat (fn [response] (p/mcat (fn [response]
(if (not= (.-status response) 200) (if (not= (.-status response) 200)
(ex/raise :type :internal (ex/raise :type :internal

View File

@@ -75,7 +75,8 @@
[path] [path]
(->> (.stat fs/promises path) (->> (.stat fs/promises path)
(p/fmap (fn [data] (p/fmap (fn [data]
{:created-at (inst-ms (.-ctime ^js data)) {:path path
:created-at (inst-ms (.-ctime ^js data))
:size (.-size data)})) :size (.-size data)}))
(p/merr (fn [_cause] (p/merr (fn [_cause]
(p/resolved nil))))) (p/resolved nil)))))

View File

@@ -582,6 +582,7 @@ __metadata:
raw-body: "npm:^3.0.1" raw-body: "npm:^3.0.1"
source-map-support: "npm:^0.5.21" source-map-support: "npm:^0.5.21"
svgo: "penpot/svgo#v3.1" svgo: "penpot/svgo#v3.1"
undici: "npm:^7.16.0"
ws: "npm:^8.18.3" ws: "npm:^8.18.3"
xml-js: "npm:^1.6.11" xml-js: "npm:^1.6.11"
xregexp: "npm:^5.1.2" xregexp: "npm:^5.1.2"
@@ -1513,6 +1514,13 @@ __metadata:
languageName: node languageName: node
linkType: hard 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": "unique-filename@npm:^4.0.0":
version: 4.0.0 version: 4.0.0
resolution: "unique-filename@npm:4.0.0" resolution: "unique-filename@npm:4.0.0"