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) {