diff --git a/packages/common/nbstore/src/impls/cloud/blob.ts b/packages/common/nbstore/src/impls/cloud/blob.ts index 7c3711739d..9e624f0429 100644 --- a/packages/common/nbstore/src/impls/cloud/blob.ts +++ b/packages/common/nbstore/src/impls/cloud/blob.ts @@ -95,7 +95,7 @@ export class CloudBlobStorage extends BlobStorageBase { try { const blobSizeLimit = await this.getBlobSizeLimit(); if (blob.data.byteLength > blobSizeLimit) { - throw new OverSizeError(); + throw new OverSizeError(this.humanReadableBlobSizeLimitCache); } await this.connection.gql({ query: setBlobMutation, @@ -113,10 +113,10 @@ export class CloudBlobStorage extends BlobStorageBase { throw new OverCapacityError(); } if (userFriendlyError.is('BLOB_QUOTA_EXCEEDED')) { - throw new OverSizeError(); + throw new OverSizeError(this.humanReadableBlobSizeLimitCache); } if (userFriendlyError.is('CONTENT_TOO_LARGE')) { - throw new OverSizeError(); + throw new OverSizeError(this.humanReadableBlobSizeLimitCache); } throw err; } @@ -148,6 +148,7 @@ export class CloudBlobStorage extends BlobStorageBase { })); } + private humanReadableBlobSizeLimitCache: string | null = null; private blobSizeLimitCache: number | null = null; private blobSizeLimitCacheTime = 0; private async getBlobSizeLimit() { @@ -164,6 +165,8 @@ export class CloudBlobStorage extends BlobStorageBase { variables: { id: this.options.id }, }); + this.humanReadableBlobSizeLimitCache = + res.workspace.quota.humanReadable.blobLimit; this.blobSizeLimitCache = res.workspace.quota.blobLimit; this.blobSizeLimitCacheTime = Date.now(); return this.blobSizeLimitCache; diff --git a/packages/common/nbstore/src/impls/cloud/http.ts b/packages/common/nbstore/src/impls/cloud/http.ts index 2ef3f6d97f..f327d1ede0 100644 --- a/packages/common/nbstore/src/impls/cloud/http.ts +++ b/packages/common/nbstore/src/impls/cloud/http.ts @@ -16,7 +16,7 @@ export class HttpConnection extends DummyConnection { const timeout = 15000; const timeoutId = setTimeout(() => { - abortController.abort('timeout'); + abortController.abort(new Error('request timeout')); }, timeout); const res = await globalThis diff --git a/packages/common/nbstore/src/storage/errors/over-size.ts b/packages/common/nbstore/src/storage/errors/over-size.ts index 67ac4bf2b2..bbedb1a2dd 100644 --- a/packages/common/nbstore/src/storage/errors/over-size.ts +++ b/packages/common/nbstore/src/storage/errors/over-size.ts @@ -1,5 +1,6 @@ export class OverSizeError extends Error { - constructor(public originError?: any) { - super('Blob size exceeds the limit.'); + constructor(limit: string | null) { + const formattedLimit = limit ? `${limit} ` : ''; + super(`File size exceeds the ${formattedLimit}limit.`); } } diff --git a/packages/common/nbstore/src/sync/blob/peer.ts b/packages/common/nbstore/src/sync/blob/peer.ts index 79858e5af1..cd5cc91108 100644 --- a/packages/common/nbstore/src/sync/blob/peer.ts +++ b/packages/common/nbstore/src/sync/blob/peer.ts @@ -185,8 +185,7 @@ export class BlobSyncPeer { this.status.remoteOverCapacity(); this.status.blobError(blob.key, 'Remote storage over capacity'); } else if (err instanceof OverSizeError) { - this.status.blobOverSize(blob.key); - this.status.blobError(blob.key, 'Blob size too large'); + this.status.blobOverSizeWithError(blob.key, err.message); } else { this.status.blobError( blob.key, @@ -445,7 +444,6 @@ class BlobSyncPeerStatus { if (deleted) { this.statusUpdatedSubject$.next(blobId); } - this.blobErrorFree(blobId); } blobWillUpload(blobId: string) { @@ -517,6 +515,12 @@ class BlobSyncPeerStatus { this.statusUpdatedSubject$.next(blobId); } + blobOverSizeWithError(blobId: string, errorMessage: string) { + this.overSize.add(blobId); + this.error.set(blobId, errorMessage); + this.statusUpdatedSubject$.next(blobId); + } + blobErrorFree(blobId: string) { let deleted = false; deleted = this.error.delete(blobId) || deleted;