fluncle 0.92.0 → 0.93.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/bin/fluncle.mjs +29 -11
  2. package/package.json +1 -1
package/bin/fluncle.mjs CHANGED
@@ -556,7 +556,7 @@ function parseVersion(version) {
556
556
  var currentVersion;
557
557
  var init_version = __esm(() => {
558
558
  init_output();
559
- currentVersion = "0.92.0".trim() ? "0.92.0".trim() : "0.1.0";
559
+ currentVersion = "0.93.0".trim() ? "0.93.0".trim() : "0.1.0";
560
560
  });
561
561
 
562
562
  // src/update-notifier.ts
@@ -2186,7 +2186,7 @@ function parseVersion2(version) {
2186
2186
  var currentVersion2, latestReleaseUrl = "https://api.github.com/repos/mauricekleine/fluncle/releases/latest";
2187
2187
  var init_version2 = __esm(() => {
2188
2188
  init_output();
2189
- currentVersion2 = "0.92.0".trim() ? "0.92.0".trim() : "0.1.0";
2189
+ currentVersion2 = "0.93.0".trim() ? "0.93.0".trim() : "0.1.0";
2190
2190
  });
2191
2191
 
2192
2192
  // ../../packages/registry/src/index.ts
@@ -3755,7 +3755,7 @@ async function uploadRenditionMultipart(masterPath, presignPath, onProgress = ()
3755
3755
  throw new CliError2("presign_missing", `Worker did not sign part ${part.partNumber} of ${plan.partCount}`);
3756
3756
  }
3757
3757
  onProgress(`Set video: part ${part.partNumber}/${plan.partCount}`);
3758
- const etag = await putPart(url, renditionPath, part);
3758
+ const etag = await putPart(url, renditionPath, part, onProgress);
3759
3759
  completed.push({ etag, partNumber: part.partNumber });
3760
3760
  }
3761
3761
  await completeUpload(presign.completeUrl, completed);
@@ -3768,14 +3768,32 @@ async function uploadRenditionMultipart(masterPath, presignPath, onProgress = ()
3768
3768
  rmSync2(renditionPath, { force: true });
3769
3769
  }
3770
3770
  }
3771
- async function putPart(url, path2, part) {
3772
- const response = await fetch(url, {
3773
- body: Bun.file(path2).slice(part.start, part.end),
3774
- method: "PUT"
3775
- });
3771
+ async function putPart(url, path2, part, onProgress = () => {}) {
3772
+ const body = await Bun.file(path2).slice(part.start, part.end).arrayBuffer();
3773
+ for (let attempt = 1;; attempt += 1) {
3774
+ try {
3775
+ return await putPartOnce(url, body, part);
3776
+ } catch (error) {
3777
+ if (error instanceof CliError2) {
3778
+ throw error;
3779
+ }
3780
+ if (attempt >= MAX_PART_ATTEMPTS) {
3781
+ throw new CliError2("r2_part_failed", `Part ${part.partNumber} failed after ${MAX_PART_ATTEMPTS} attempts: ${error instanceof Error ? error.message : String(error)}`);
3782
+ }
3783
+ const backoffMs = 500 * 2 ** (attempt - 1);
3784
+ onProgress(`Set video: part ${part.partNumber} dropped — retry ${attempt}/${MAX_PART_ATTEMPTS - 1} in ${backoffMs}ms…`);
3785
+ await new Promise((resolve) => setTimeout(resolve, backoffMs));
3786
+ }
3787
+ }
3788
+ }
3789
+ async function putPartOnce(url, body, part) {
3790
+ const response = await fetch(url, { body, method: "PUT" });
3776
3791
  if (!response.ok) {
3777
3792
  const detail = (await response.text().catch(() => "")).slice(0, 300);
3778
- throw new CliError2("r2_part_failed", `R2 rejected part ${part.partNumber} (${response.status} ${response.statusText})${detail ? `: ${detail}` : ""}`);
3793
+ if (response.status < 500) {
3794
+ throw new CliError2("r2_part_failed", `R2 rejected part ${part.partNumber} (${response.status} ${response.statusText})${detail ? `: ${detail}` : ""}`);
3795
+ }
3796
+ throw new Error(`R2 ${response.status} ${response.statusText} on part ${part.partNumber}${detail ? `: ${detail}` : ""}`);
3779
3797
  }
3780
3798
  const etag = response.headers.get("etag");
3781
3799
  if (!etag) {
@@ -3819,7 +3837,7 @@ async function deriveRendition(inputPath, outputPath) {
3819
3837
  throw new CliError2("ffmpeg_failed", `ffmpeg failed to derive the set-video rendition${detail ? `: ${detail}` : ""}`);
3820
3838
  }
3821
3839
  }
3822
- var FOUND_BASE2 = "https://found.fluncle.com", SET_VIDEO_RENDITION, DEFAULT_PART_SIZE, MIN_PART_SIZE, MAX_PARTS = 1e4;
3840
+ var FOUND_BASE2 = "https://found.fluncle.com", SET_VIDEO_RENDITION, DEFAULT_PART_SIZE, MIN_PART_SIZE, MAX_PARTS = 1e4, MAX_PART_ATTEMPTS = 5;
3823
3841
  var init_mixtape_set_video = __esm(() => {
3824
3842
  init_api();
3825
3843
  init_output();
@@ -3829,7 +3847,7 @@ var init_mixtape_set_video = __esm(() => {
3829
3847
  gopSeconds: 2,
3830
3848
  height: 1080
3831
3849
  };
3832
- DEFAULT_PART_SIZE = 100 * 1024 * 1024;
3850
+ DEFAULT_PART_SIZE = 16 * 1024 * 1024;
3833
3851
  MIN_PART_SIZE = 5 * 1024 * 1024;
3834
3852
  });
3835
3853
 
package/package.json CHANGED
@@ -31,5 +31,5 @@
31
31
  "url": "git+https://github.com/mauricekleine/fluncle.git"
32
32
  },
33
33
  "type": "module",
34
- "version": "0.92.0"
34
+ "version": "0.93.0"
35
35
  }