1 parent
594889ea10
commit
68166ad7eb
6 files changed
+32
-4
No files matched your search
@@ -9,11 +9,17 @@ const copyWithProgress = async ({
|
|||||||
updateProgress,
|
updateProgress,
|
||||||
label,
|
label,
|
||||||
copyMethod = 'auto',
|
copyMethod = 'auto',
|
||||||
|
bufferSizeMb = 16,
|
||||||
maxRetries = 2,
|
maxRetries = 2,
|
||||||
retryDelayMs = 1000,
|
retryDelayMs = 1000,
|
||||||
}) => {
|
}) => {
|
||||||
const sourceSize = fs.statSync(source).size;
|
const sourceSize = fs.statSync(source).size;
|
||||||
const sourceSizeMb = (sourceSize / 1024 / 1024).toFixed(1);
|
const sourceSizeMb = (sourceSize / 1024 / 1024).toFixed(1);
|
||||||
|
const normalizedBufferSizeMb = Math.min(
|
||||||
|
Math.max(Number.parseInt(bufferSizeMb, 10) || 16, 1),
|
||||||
|
128,
|
||||||
|
);
|
||||||
|
const bufferSize = normalizedBufferSizeMb * 1024 * 1024;
|
||||||
|
|
||||||
const report = (percent, message) => {
|
const report = (percent, message) => {
|
||||||
const boundedPercent = Math.min(Math.max(percent, 0), 100);
|
const boundedPercent = Math.min(Math.max(percent, 0), 100);
|
||||||
@@ -30,8 +36,8 @@ const copyWithProgress = async ({
|
|||||||
const startMs = Date.now();
|
const startMs = Date.now();
|
||||||
let copiedBytes = 0;
|
let copiedBytes = 0;
|
||||||
let nextProgressPercent = 0;
|
let nextProgressPercent = 0;
|
||||||
const rd = fs.createReadStream(source, { highWaterMark: 4 * 1024 * 1024 });
|
const rd = fs.createReadStream(source, { highWaterMark: bufferSize });
|
||||||
const wr = fs.createWriteStream(destination, { highWaterMark: 4 * 1024 * 1024 });
|
const wr = fs.createWriteStream(destination, { highWaterMark: bufferSize });
|
||||||
let settled = false;
|
let settled = false;
|
||||||
const fail = (error) => {
|
const fail = (error) => {
|
||||||
if (settled) return;
|
if (settled) return;
|
||||||
|
|||||||
@@ -33,6 +33,14 @@ const details = () => ({
|
|||||||
inputUI: { type: 'dropdown', options: ['auto', 'native', 'stream'] },
|
inputUI: { type: 'dropdown', options: ['auto', 'native', 'stream'] },
|
||||||
tooltip: 'Auto uses the operating system copy API; stream is a fallback for problematic mounts.',
|
tooltip: 'Auto uses the operating system copy API; stream is a fallback for problematic mounts.',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
label: 'Stream buffer size (MB)',
|
||||||
|
name: 'bufferSizeMb',
|
||||||
|
type: 'string',
|
||||||
|
defaultValue: '16',
|
||||||
|
inputUI: { type: 'dropdown', options: ['4', '16', '64'] },
|
||||||
|
tooltip: 'Used only with stream copy; larger values can improve high-latency SMB mounts.',
|
||||||
|
},
|
||||||
],
|
],
|
||||||
outputs: [{ number: 1, tooltip: 'File is ready in workDir — continue to next plugin' }],
|
outputs: [{ number: 1, tooltip: 'File is ready in workDir — continue to next plugin' }],
|
||||||
});
|
});
|
||||||
@@ -66,6 +74,7 @@ const plugin = async (args) => {
|
|||||||
updateProgress: args.updateProgress,
|
updateProgress: args.updateProgress,
|
||||||
label: 'copyToWorkDir',
|
label: 'copyToWorkDir',
|
||||||
copyMethod: args.inputs.copyMethod || 'auto',
|
copyMethod: args.inputs.copyMethod || 'auto',
|
||||||
|
bufferSizeMb: args.inputs.bufferSizeMb || '16',
|
||||||
});
|
});
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|||||||
@@ -33,6 +33,14 @@ const details = () => ({
|
|||||||
inputUI: { type: 'dropdown', options: ['auto', 'native', 'stream'] },
|
inputUI: { type: 'dropdown', options: ['auto', 'native', 'stream'] },
|
||||||
tooltip: 'Auto uses the operating system copy API; stream is a fallback for problematic mounts.',
|
tooltip: 'Auto uses the operating system copy API; stream is a fallback for problematic mounts.',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
label: 'Stream buffer size (MB)',
|
||||||
|
name: 'bufferSizeMb',
|
||||||
|
type: 'string',
|
||||||
|
defaultValue: '16',
|
||||||
|
inputUI: { type: 'dropdown', options: ['4', '16', '64'] },
|
||||||
|
tooltip: 'Used only with stream copy; larger values can improve high-latency SMB mounts.',
|
||||||
|
},
|
||||||
],
|
],
|
||||||
outputs: [{ number: 1, tooltip: 'Original file replaced — continue to next plugin' }],
|
outputs: [{ number: 1, tooltip: 'Original file replaced — continue to next plugin' }],
|
||||||
});
|
});
|
||||||
@@ -71,6 +79,7 @@ const plugin = async (args) => {
|
|||||||
updateProgress: args.updateProgress,
|
updateProgress: args.updateProgress,
|
||||||
label: 'replaceOriginalFile',
|
label: 'replaceOriginalFile',
|
||||||
copyMethod: args.inputs.copyMethod || 'auto',
|
copyMethod: args.inputs.copyMethod || 'auto',
|
||||||
|
bufferSizeMb: args.inputs.bufferSizeMb || '16',
|
||||||
});
|
});
|
||||||
|
|
||||||
if (fs.existsSync(destination)) {
|
if (fs.existsSync(destination)) {
|
||||||
|
|||||||
@@ -281,7 +281,8 @@ Streams the source file to the worker's local `workDir`, verifies the byte count
|
|||||||
reports throttled copy progress, and retries failed writes twice after removing
|
reports throttled copy progress, and retries failed writes twice after removing
|
||||||
the partial destination. Its `Copy method` input defaults to `auto` (the
|
the partial destination. Its `Copy method` input defaults to `auto` (the
|
||||||
operating system's native file-copy path) and offers `stream` as a fallback
|
operating system's native file-copy path) and offers `stream` as a fallback
|
||||||
for problematic mounts. It stores the original library path in
|
for problematic mounts. The stream fallback defaults to a 16 MB buffer and
|
||||||
|
offers 4 MB or 64 MB alternatives. It stores the original library path in
|
||||||
`variables.originalLibraryFile` for `replaceOriginalFile`.
|
`variables.originalLibraryFile` for `replaceOriginalFile`.
|
||||||
|
|
||||||
### 9. `replaceOriginalFile` — Replace Original File
|
### 9. `replaceOriginalFile` — Replace Original File
|
||||||
|
|||||||
@@ -124,7 +124,8 @@ the library path for `replaceOriginalFile` 2.0.0.
|
|||||||
Both progress-enabled copy operations verify the destination size and retry
|
Both progress-enabled copy operations verify the destination size and retry
|
||||||
failed writes twice after removing the partial destination. Their `Copy method`
|
failed writes twice after removing the partial destination. Their `Copy method`
|
||||||
input defaults to `auto` (the operating system's native file-copy path), with
|
input defaults to `auto` (the operating system's native file-copy path), with
|
||||||
`stream` available as a fallback for problematic SMB/CIFS mounts.
|
`stream` available as a fallback for problematic SMB/CIFS mounts. Stream mode
|
||||||
|
supports 4 MB, 16 MB, and 64 MB buffers.
|
||||||
Both progress-enabled plugins require
|
Both progress-enabled plugins require
|
||||||
`FlowHelpers/1.0.0/copyWithProgress.js`; the installer downloads it
|
`FlowHelpers/1.0.0/copyWithProgress.js`; the installer downloads it
|
||||||
automatically.
|
automatically.
|
||||||
|
|||||||
@@ -225,6 +225,8 @@ const AUDIO_INPUTS = {
|
|||||||
ok(copyHelperCode.includes('fs.promises.copyFile(source, destination)'), 'copy helper uses native file copying');
|
ok(copyHelperCode.includes('fs.promises.copyFile(source, destination)'), 'copy helper uses native file copying');
|
||||||
ok(copyHelperCode.includes("copyMethod = 'auto'"), 'copy helper defaults to automatic copy selection');
|
ok(copyHelperCode.includes("copyMethod = 'auto'"), 'copy helper defaults to automatic copy selection');
|
||||||
ok(copyHelperCode.includes("copyMethod === 'stream'"), 'copy helper supports stream fallback');
|
ok(copyHelperCode.includes("copyMethod === 'stream'"), 'copy helper supports stream fallback');
|
||||||
|
ok(copyHelperCode.includes('bufferSizeMb = 16'), 'copy helper defaults stream buffer to 16 MB');
|
||||||
|
ok(copyHelperCode.includes('128'), 'copy helper caps stream buffer size');
|
||||||
|
|
||||||
// ── Summary ───────────────────────────────────────────────────────────────
|
// ── Summary ───────────────────────────────────────────────────────────────
|
||||||
console.log(`\n${'='.repeat(55)}`);
|
console.log(`\n${'='.repeat(55)}`);
|
||||||
|
|||||||
Reference in new issue
Block a user