From e084e0a981101187ba23375984334fe05fe1e26d Mon Sep 17 00:00:00 2001 From: ZGaetano Date: Fri, 5 Jun 2026 12:24:28 -0400 Subject: [PATCH] =?UTF-8?q?fix(panel):=20revert=20import-flow=20fs=20shim?= =?UTF-8?q?=20=E2=80=94=20broke=20proxy/hi-res=20import=20on=20UXP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit v2.2.3 wrapped UXP's fs calls in a node-style `fs.promises || callback` shim. UXP's require('fs') returns promise-based methods (not node callback-style), so the fallback `fs.writeFile(path, data, cb)` path never settles and proxy/hi-res import hung — import stopped working entirely. Restore the v2.1.6 (2.2.2-shipped) direct `await fs.writeFile / fs.stat / fs.readFile` form, which is verified working in Premiere. Capture/recorder/deltacast untouched. --- .../premiere-plugin-uxp/src/import-flow.js | 29 +++++++------------ 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/services/premiere-plugin-uxp/src/import-flow.js b/services/premiere-plugin-uxp/src/import-flow.js index 86fa151..b93d2d4 100644 --- a/services/premiere-plugin-uxp/src/import-flow.js +++ b/services/premiere-plugin-uxp/src/import-flow.js @@ -1,29 +1,20 @@ -// import-flow.js — v2.2.3 +// import-flow.js — v2.2.4 // premierepro API: docs say sync, runtime returns Promises. Await everything. +// +// NOTE: UXP's require('fs') exposes promise-returning writeFile/stat/readFile +// directly — await them as-is. Do NOT wrap them in a node-style +// `fs.promises || callback` shim: UXP's methods are not node-callback-style, +// so the callback fallback never settles and import hangs (regressed in +// v2.2.3, reverted here). (function () { const Import = {}; const fs = require('fs'); - const fsPromises = fs.promises || {}; // window.path is a UXP global (v6.4+) — no require('path') let os; try { os = require('os'); } catch (_) { os = {}; } let uxpFs; try { uxpFs = require('uxp').storage.localFileSystem; } catch (_) { uxpFs = null; } - // UXP fs is callback-based — wrap in Promise where promisify unavailable. - function _writeFile(path, data) { - if (fsPromises.writeFile) return fsPromises.writeFile(path, data); - return new Promise((resolve, reject) => { fs.writeFile(path, data, (err) => { if (err) reject(err); else resolve(); }); }); - } - function _readFile(path) { - if (fsPromises.readFile) return fsPromises.readFile(path); - return new Promise((resolve, reject) => { fs.readFile(path, (err, data) => { if (err) reject(err); else resolve(data); }); }); - } - function _stat(path) { - if (fsPromises.stat) return fsPromises.stat(path); - return new Promise((resolve, reject) => { fs.stat(path, (err, stats) => { if (err) reject(err); else resolve(stats); }); }); - } - // ── Temp folder ────────────────────────────────────────────────── async function _getTempBase() { if (uxpFs && uxpFs.getTemporaryFolder) { @@ -54,7 +45,7 @@ // Returns true if the path already exists on disk. Import._fileExists = async function (filePath) { - try { await _stat(filePath); return true; } catch (_) { return false; } + try { await fs.stat(filePath); return true; } catch (_) { return false; } }; // Write ArrayBuffer to disk via fs.writeFile. @@ -62,7 +53,7 @@ // previous import) we treat that as success: the bytes are already there. Import._writeBuffer = async function (destPath, arrayBuffer) { try { - await _writeFile(destPath, arrayBuffer); + await fs.writeFile(destPath, arrayBuffer); } catch (e) { const busy = e.code === 'EBUSY' || /resource busy/i.test(String(e.message)); if (!busy) throw e; @@ -194,7 +185,7 @@ const filename = meta.filename || path.basename(nativePath); const contentType = _contentType(filename); - const buf = await _readFile(nativePath); + const buf = await fs.readFile(nativePath); const size = buf.byteLength != null ? buf.byteLength : buf.length; if (size <= SIMPLE_MAX) {