trajectories-sh 1.24.0 → 1.25.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.
@@ -1,7 +1,6 @@
1
1
  import {
2
2
  parseJobId
3
- } from "./chunk-LOJZPDGI.js";
4
- import "./chunk-72L6XPK6.js";
3
+ } from "./chunk-MMQI3LNY.js";
5
4
  import {
6
5
  getApiUrl,
7
6
  getAuthHeader
@@ -159,12 +158,13 @@ function formatComment(comment) {
159
158
  return `[${comment.id}] ${author} \xB7 ${scope}${when ? ` \xB7 ${when}` : ""}
160
159
  ${comment.body}`;
161
160
  }
161
+
162
162
  export {
163
- addComment,
164
- deleteComment,
165
- formatComment,
166
- listComments,
167
163
  parseCommentTarget,
168
164
  readCommentBody,
169
- updateComment
165
+ addComment,
166
+ listComments,
167
+ updateComment,
168
+ deleteComment,
169
+ formatComment
170
170
  };
@@ -15,6 +15,16 @@ var UUID_RE = /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/i;
15
15
  var BATCH_SIZE = 100;
16
16
  var CONCURRENCY = 25;
17
17
  var DOWNLOAD_TIMEOUT_MS = 18e4;
18
+ var MAX_ATTEMPTS = 7;
19
+ function retryDelayMs(attempt, status = 0, retryAfter = null) {
20
+ if (retryAfter) {
21
+ const secs = Number(retryAfter);
22
+ const ms = Number.isFinite(secs) ? secs * 1e3 : Date.parse(retryAfter) - Date.now();
23
+ if (Number.isFinite(ms) && ms > 0) return Math.min(ms, 3e4);
24
+ }
25
+ const base = Math.min(16e3, 500 * 2 ** attempt) * (status === 429 ? 2 : 1);
26
+ return Math.round(base / 2 + Math.random() * (base / 2));
27
+ }
18
28
  var EXIT = {
19
29
  OK: 0,
20
30
  ERROR: 1,
@@ -154,10 +164,14 @@ async function downloadPlannedJob(plan, outputDir, options) {
154
164
  const downloadUrl = signedUrl ?? `${apiUrl}/api/cli/download/${jobId}/file?path=${encodeURIComponent(file.path)}`;
155
165
  const downloadHeaders = signedUrl ? {} : headers;
156
166
  let ok = false;
157
- for (let attempt = 0; attempt < 3 && !ok; attempt++) {
167
+ for (let attempt = 0; attempt < MAX_ATTEMPTS && !ok; attempt++) {
168
+ let wait = 0;
158
169
  try {
159
170
  const resp = await fetch(downloadUrl, { headers: downloadHeaders, signal: AbortSignal.timeout(DOWNLOAD_TIMEOUT_MS) });
160
- if (!resp.ok) throw new Error(`HTTP ${resp.status}`);
171
+ if (!resp.ok) {
172
+ wait = retryDelayMs(attempt, resp.status, resp.headers.get("retry-after"));
173
+ throw new Error(`HTTP ${resp.status}`);
174
+ }
161
175
  const data = Buffer.from(await resp.arrayBuffer());
162
176
  const outPath = join(outputDir, file.path);
163
177
  mkdirSync(dirname(outPath), { recursive: true });
@@ -167,7 +181,7 @@ async function downloadPlannedJob(plan, outputDir, options) {
167
181
  bar.tick(data.length);
168
182
  ok = true;
169
183
  } catch {
170
- if (attempt < 2) await new Promise((r) => setTimeout(r, 1e3 * (attempt + 1)));
184
+ if (attempt < MAX_ATTEMPTS - 1) await new Promise((r) => setTimeout(r, wait || retryDelayMs(attempt)));
171
185
  }
172
186
  }
173
187
  if (!ok) {
@@ -229,6 +243,7 @@ function dirBytes(dir) {
229
243
 
230
244
  export {
231
245
  DOWNLOAD_TIMEOUT_MS,
246
+ retryDelayMs,
232
247
  EXIT,
233
248
  CliError,
234
249
  httpError,