Skip to content
Merged
5 changes: 5 additions & 0 deletions .changeset/eleven-cycles-hang.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@firebase/storage": patch
---

Fixed issue where pause throws an error
6 changes: 3 additions & 3 deletions packages/storage/src/implementation/request.ts
Original file line number Diff line number Diff line change
Expand Up @@ -120,9 +120,9 @@ class NetworkRequest<I extends ConnectionType, O> implements Request<O> {
const hitServer = connection.getErrorCode() === ErrorCode.NO_ERROR;
const status = connection.getStatus();
if (
(!hitServer ||
isRetryStatusCode(status, this.additionalRetryCodes_)) &&
this.retry
!hitServer ||
(isRetryStatusCode(status, this.additionalRetryCodes_) &&
this.retry)
) {
const wasCanceled = connection.getErrorCode() === ErrorCode.ABORT;
backoffCallback(
Expand Down
28 changes: 28 additions & 0 deletions packages/storage/test/integration/integration.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ import {
import { use, expect } from 'chai';
import chaiAsPromised from 'chai-as-promised';
import * as types from '../../src/public-types';
import { waitFor } from '../../../database/test/helpers/util';
import { Deferred } from '@firebase/util';

use(chaiAsPromised);

Expand Down Expand Up @@ -187,4 +189,30 @@ describe('FirebaseStorage Exp', () => {
expect(listResult.items.map(v => v.name)).to.have.members(['a', 'b']);
expect(listResult.prefixes.map(v => v.name)).to.have.members(['c']);
});

it('can pause uploads without an error', async () => {
const referenceA = ref(storage, 'public/exp-upload/a');
const bytesToUpload = new ArrayBuffer(1024 * 1024);
const task = uploadBytesResumable(referenceA, bytesToUpload);
const failureDeferred = new Deferred();
let hasPaused = false;
task.on(
'state_changed',
snapshot => {
const p = [snapshot.bytesTransferred, snapshot.totalBytes];
if (snapshot.bytesTransferred > 0 && !hasPaused) {
task.pause();
hasPaused = true;
}
},
() => {
failureDeferred.reject('Failed to upload file');
}
);
await Promise.race([failureDeferred.promise, waitFor(5000)]);
task.resume();
await task;
const bytes = await getBytes(referenceA);
expect(bytes).to.deep.eq(bytesToUpload);
});
});