Skip to content

Commit 11b36ad

Browse files
authored
fix(storage): task promise fixes (angular#1430)
1 parent 72f7d96 commit 11b36ad

File tree

6 files changed

+46
-36
lines changed

6 files changed

+46
-36
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "angularfire2",
3-
"version": "5.0.0-rc.5.6-next",
3+
"version": "5.0.0-rc.6",
44
"description": "The official library of Firebase and Angular.",
55
"private": true,
66
"scripts": {

src/storage/observable/fromTask.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { UploadTask, UploadTaskSnapshot } from '@firebase/storage-types';
22
import { Observable } from 'rxjs/Observable';
33

44
export function fromTask(task: UploadTask) {
5-
return new Observable<UploadTaskSnapshot | undefined>(subscriber => {
5+
return new Observable<UploadTaskSnapshot>(subscriber => {
66
const progress = (snap: UploadTaskSnapshot) => subscriber.next(snap);
77
const error = e => subscriber.error(e);
88
const complete = () => subscriber.complete();

src/storage/ref.ts

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,20 +20,18 @@ export interface AngularFireStorageReference {
2020
*/
2121
export function createStorageRef(ref: Reference): AngularFireStorageReference {
2222
return {
23-
getDownloadURL() { return from(ref.getDownloadURL()); },
24-
getMetadata() { return from(ref.getMetadata()) },
25-
delete() { return from(ref.delete()); },
26-
child(path: string) { return createStorageRef(ref.child(path)); },
27-
updateMetatdata(meta: SettableMetadata) {
28-
return from(ref.updateMetadata(meta));
29-
},
30-
put(data: any, metadata?: UploadMetadata) {
23+
getDownloadURL: () => from(ref.getDownloadURL()),
24+
getMetadata: () => from(ref.getMetadata()),
25+
delete: () => from(ref.delete()),
26+
child: (path: string) => createStorageRef(ref.child(path)),
27+
updateMetatdata: (meta: SettableMetadata) => from(ref.updateMetadata(meta)),
28+
put: (data: any, metadata?: UploadMetadata) => {
3129
const task = ref.put(data, metadata);
3230
return createUploadTask(task);
3331
},
34-
putString(data: string, format?: StringFormat, metadata?: UploadMetadata) {
32+
putString: (data: string, format?: StringFormat, metadata?: UploadMetadata) => {
3533
const task = ref.putString(data, format, metadata);
3634
return createUploadTask(task);
3735
}
38-
}
36+
};
3937
}

src/storage/storage.spec.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { Observable } from 'rxjs/Observable'
33
import { forkJoin } from 'rxjs/observable/forkJoin';
44
import { TestBed, inject } from '@angular/core/testing';
55
import { FirebaseApp, FirebaseAppConfig, AngularFireModule } from 'angularfire2';
6-
import { AngularFireStorageModule, AngularFireStorage } from 'angularfire2/storage';
6+
import { AngularFireStorageModule, AngularFireStorage, AngularFireUploadTask } from 'angularfire2/storage';
77
import { COMMON_CONFIG } from './test-config';
88

99
describe('AngularFireStorage', () => {
@@ -63,6 +63,18 @@ describe('AngularFireStorage', () => {
6363
() => { ref.delete().subscribe(done, done.fail); }
6464
);
6565
});
66+
67+
it('should resolve the task as a promise', (done) => {
68+
const data = { angular: "promise" };
69+
const blob = new Blob([JSON.stringify(data)], { type : 'application/json' });
70+
const ref = afStorage.ref('afs.json');
71+
const task: AngularFireUploadTask = ref.put(blob);
72+
task.then(snap => {
73+
expect(snap).toBeDefined();
74+
done();
75+
}).catch(done.fail);
76+
});
77+
6678
});
6779

6880
describe('reference', () => {

src/storage/storage.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import { Observable } from 'rxjs/Observable';
1111
* This service is the main entry point for this feature module. It provides
1212
* an API for uploading and downloading binary files from Cloud Storage for
1313
* Firebase.
14-
*
1514
*/
1615
@Injectable()
1716
export class AngularFireStorage {

src/storage/task.ts

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,41 +2,42 @@ import { UploadTaskSnapshot, UploadTask } from '@firebase/storage-types';
22
import { fromTask } from './observable/fromTask';
33
import { Observable } from 'rxjs/Observable';
44
import { map, filter } from 'rxjs/operators';
5+
import { from } from 'rxjs/observable/from';
56

67
export interface AngularFireUploadTask {
8+
task: UploadTask,
79
snapshotChanges(): Observable<UploadTaskSnapshot | undefined>;
810
percentageChanges(): Observable<number | undefined>;
911
downloadURL(): Observable<string | null>;
1012
pause(): boolean;
1113
cancel(): boolean;
1214
resume(): boolean;
13-
then(): Promise<any>;
15+
then(
16+
onFulfilled?: ((a: UploadTaskSnapshot) => any) | null,
17+
onRejected?: ((a: Error) => any) | null
18+
): Promise<any>;
1419
catch(onRejected: (a: Error) => any): Promise<any>;
1520
}
1621

22+
/**
23+
* Create an AngularFireUploadTask from a regular UploadTask from the Storage SDK.
24+
* This method creates an observable of the upload and returns on object that provides
25+
* multiple methods for controlling and monitoring the file upload.
26+
* @param task
27+
*/
1728
export function createUploadTask(task: UploadTask): AngularFireUploadTask {
1829
const inner$ = fromTask(task);
1930
return {
20-
pause() { return task.pause(); },
21-
cancel() { return task.cancel(); },
22-
resume() { return task.resume(); },
23-
then() { return task.then(); },
24-
catch(onRejected: (a: Error) => any) {
25-
return task.catch(onRejected);
26-
},
27-
snapshotChanges() { return inner$; },
28-
percentageChanges() {
29-
return inner$.pipe(
30-
filter(s => s !== undefined),
31-
map(s => s!.bytesTransferred / s!.totalBytes * 100)
32-
);
33-
},
34-
downloadURL() {
35-
return inner$.pipe(
36-
filter(s => s !== undefined),
37-
filter(s => s!.bytesTransferred === s!.totalBytes),
38-
map(s => s!.downloadURL)
39-
);
40-
}
31+
task: task,
32+
then: task.then.bind(task),
33+
catch: task.catch.bind(task),
34+
pause: task.pause.bind(task),
35+
cancel: task.cancel.bind(task),
36+
resume: task.resume.bind(task),
37+
snapshotChanges: () => inner$,
38+
downloadURL: () => from(task.then(s => s.downloadURL)),
39+
percentageChanges: () => inner$.pipe(
40+
map(s => s.bytesTransferred / s.totalBytes * 100)
41+
)
4142
};
4243
}

0 commit comments

Comments
 (0)