@liveblocks/node 3.23.0-file3 → 3.23.0-file4

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.
package/dist/index.js CHANGED
@@ -3,7 +3,7 @@ import { detectDupes } from "@liveblocks/core";
3
3
 
4
4
  // src/version.ts
5
5
  var PKG_NAME = "@liveblocks/node";
6
- var PKG_VERSION = "3.23.0-file3";
6
+ var PKG_VERSION = "3.23.0-file4";
7
7
  var PKG_FORMAT = "esm";
8
8
 
9
9
  // src/client.ts
@@ -338,7 +338,23 @@ async function uploadStorageFile({
338
338
  }
339
339
  let uploadId;
340
340
  const uploadedParts = [];
341
- const multipartUpload = await createMultipartUpload();
341
+ const multipartUpload = await autoRetry(
342
+ createMultipartUpload,
343
+ STORAGE_FILE_RETRY_ATTEMPTS,
344
+ STORAGE_FILE_RETRY_DELAYS,
345
+ handleRetryError
346
+ );
347
+ const partUploadController = new AbortController();
348
+ const partUploadSignal = partUploadController.signal;
349
+ const abortPartUploads = (reason) => {
350
+ partUploadController.abort(reason);
351
+ };
352
+ const handleExternalAbort = () => abortPartUploads();
353
+ if (signal?.aborted) {
354
+ handleExternalAbort();
355
+ } else {
356
+ signal?.addEventListener("abort", handleExternalAbort, { once: true });
357
+ }
342
358
  try {
343
359
  uploadId = multipartUpload.uploadId;
344
360
  if (signal?.aborted) {
@@ -346,18 +362,43 @@ async function uploadStorageFile({
346
362
  }
347
363
  const batches = chunk(splitStorageFileIntoParts(file), 5);
348
364
  for (const parts of batches) {
349
- const uploadedPartPromises = [];
365
+ const firstPartUploadFailure = {};
366
+ const partUploads$ = [];
350
367
  for (const { part, partNumber } of parts) {
351
- uploadedPartPromises.push(
368
+ partUploads$.push(
352
369
  autoRetry(
353
- () => uploadMultipartPart(multipartUpload.uploadId, partNumber, part),
370
+ () => uploadMultipartPart(
371
+ multipartUpload.uploadId,
372
+ partNumber,
373
+ part,
374
+ partUploadSignal
375
+ ),
354
376
  STORAGE_FILE_RETRY_ATTEMPTS,
355
377
  STORAGE_FILE_RETRY_DELAYS,
356
- handleRetryError
357
- )
378
+ (error) => {
379
+ if (signal?.aborted) {
380
+ throw abortError;
381
+ }
382
+ return partUploadSignal.aborted || handleRetryError(error);
383
+ }
384
+ ).catch((error) => {
385
+ if (firstPartUploadFailure.value === void 0) {
386
+ firstPartUploadFailure.value = { error };
387
+ abortPartUploads(error);
388
+ }
389
+ throw error;
390
+ })
358
391
  );
359
392
  }
360
- uploadedParts.push(...await Promise.all(uploadedPartPromises));
393
+ const settledPartUploads = await Promise.allSettled(partUploads$);
394
+ if (firstPartUploadFailure.value !== void 0) {
395
+ throw firstPartUploadFailure.value.error;
396
+ }
397
+ for (const settledPartUpload of settledPartUploads) {
398
+ if (settledPartUpload.status === "fulfilled") {
399
+ uploadedParts.push(settledPartUpload.value);
400
+ }
401
+ }
361
402
  }
362
403
  if (signal?.aborted) {
363
404
  throw abortError;
@@ -379,6 +420,8 @@ async function uploadStorageFile({
379
420
  }
380
421
  }
381
422
  throw err;
423
+ } finally {
424
+ signal?.removeEventListener("abort", handleExternalAbort);
382
425
  }
383
426
  }
384
427
  function splitStorageFileIntoParts(file) {
@@ -1418,12 +1461,12 @@ var Liveblocks = class {
1418
1461
  );
1419
1462
  return await this.#readJsonResponse(res);
1420
1463
  },
1421
- uploadMultipartPart: async (uploadId, partNumber, part) => {
1464
+ uploadMultipartPart: async (uploadId, partNumber, part, signal) => {
1422
1465
  const res = await this.#putBlob(
1423
1466
  url2`/v2/rooms/${roomId}/storage/files/${fileId}/multipart/${uploadId}/${String(partNumber)}`,
1424
1467
  part,
1425
1468
  void 0,
1426
- options
1469
+ { signal }
1427
1470
  );
1428
1471
  return await this.#readJsonResponse(res);
1429
1472
  },