Skip to content

Commit 13f945e

Browse files
authored
feat(storage): Add Storage
1 parent 36fb698 commit 13f945e

File tree

5 files changed

+63
-43
lines changed

5 files changed

+63
-43
lines changed

src/storage/interfaces.ts

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1-
import firebase from 'firebase/app';
1+
// import firebase from 'firebase/app';
22

3-
export type UploadTask = firebase.storage.UploadTask;
4-
export type UploadTaskSnapshot = firebase.storage.UploadTaskSnapshot;
5-
export type UploadMetadata = firebase.storage.UploadMetadata;
3+
export type UploadTask = import('firebase/storage').UploadTask;
4+
export type UploadTaskSnapshot = import('firebase/storage').UploadTaskSnapshot;
5+
export type UploadMetadata = import('firebase/storage').UploadMetadata;
6+
export type UploadResult = import('firebase/storage').UploadResult;
67

7-
export type SettableMetadata = firebase.storage.SettableMetadata;
8-
export type Reference = firebase.storage.Reference;
9-
export type StringFormat = firebase.storage.StringFormat;
10-
export type ListResult = firebase.storage.ListResult;
8+
export type SettableMetadata = import('firebase/storage').SettableMetadata;
9+
export type StorageReference = import('firebase/storage').StorageReference;
10+
export type StringFormat = import('firebase/storage').StringFormat;
11+
export type ListResult = import('firebase/storage').ListResult;
12+
export type StorageService = import('firebase/storage').StorageService;

src/storage/observable/fromTask.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,6 @@ import { Observable } from 'rxjs';
22
import { debounceTime } from 'rxjs/operators';
33
import { UploadTask, UploadTaskSnapshot } from '../interfaces';
44

5-
// need to import, else the types become import('firebase/app').default.storage.UploadTask
6-
// and it no longer works w/Firebase v7
7-
import firebase from 'firebase/app';
8-
95
// Things aren't working great, I'm having to put in a lot of work-arounds for what
106
// appear to be Firebase JS SDK bugs https://github.com/firebase/firebase-js-sdk/issues/4158
117
export function fromTask(task: UploadTask) {

src/storage/ref.ts

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,25 @@
1-
import { ListResult, Reference, SettableMetadata, StringFormat, UploadMetadata } from './interfaces';
21
import { AngularFireUploadTask, createUploadTask } from './task';
32
import { from, Observable, of } from 'rxjs';
43
import { ɵAngularFireSchedulers } from '@angular/fire';
54
import { observeOn, switchMap } from 'rxjs/operators';
5+
import { ListResult,
6+
StorageReference,
7+
SettableMetadata,
8+
StringFormat,
9+
UploadMetadata,
10+
UploadResult,
11+
StorageService,
12+
} from './interfaces';
13+
import {
14+
getDownloadURL,
15+
getMetadata,
16+
ref,
17+
deleteObject,
18+
updateMetadata,
19+
uploadBytesResumable as put,
20+
uploadString as putString,
21+
listAll,
22+
} from 'firebase/storage';
623

724
export interface AngularFireStorageReference {
825
getDownloadURL(): Observable<any>;
@@ -11,7 +28,9 @@ export interface AngularFireStorageReference {
1128
child(path: string): any;
1229
updateMetadata(meta: SettableMetadata): Observable<any>;
1330
put(data: any, metadata?: UploadMetadata | undefined): AngularFireUploadTask;
14-
putString(data: string, format?: string | undefined, metadata?: UploadMetadata | undefined): AngularFireUploadTask;
31+
// MARK: Breaking change
32+
// previous: putString(data: string, format?: string | undefined, metadata?: UploadMetadata | undefined): AngularFireUploadTask;
33+
putString(data: string, format?: string | undefined, metadata?: UploadMetadata | undefined): Observable<UploadResult>;
1534
listAll(): Observable<ListResult>;
1635
}
1736

@@ -20,32 +39,35 @@ export interface AngularFireStorageReference {
2039
* creates observable methods from promise based methods.
2140
*/
2241
export function createStorageRef(
23-
ref: Reference,
42+
storage: StorageService,
43+
storageRef: StorageReference,
2444
schedulers: ɵAngularFireSchedulers,
2545
keepUnstableUntilFirst: <T>(obs$: Observable<T>) => Observable<T>
2646
): AngularFireStorageReference {
2747
return {
2848
getDownloadURL: () => of(undefined).pipe(
2949
observeOn(schedulers.outsideAngular),
30-
switchMap(() => ref.getDownloadURL()),
50+
switchMap(() => getDownloadURL(storageRef)),
3151
keepUnstableUntilFirst
3252
),
3353
getMetadata: () => of(undefined).pipe(
3454
observeOn(schedulers.outsideAngular),
35-
switchMap(() => ref.getMetadata()),
55+
switchMap(() => getMetadata(storageRef)),
3656
keepUnstableUntilFirst
3757
),
38-
delete: () => from(ref.delete()),
39-
child: (path: string) => createStorageRef(ref.child(path), schedulers, keepUnstableUntilFirst),
40-
updateMetadata: (meta: SettableMetadata) => from(ref.updateMetadata(meta)),
58+
delete: () => from(deleteObject(storageRef)),
59+
child: (path: string) => createStorageRef(storage, ref(storage, path), schedulers, keepUnstableUntilFirst),
60+
updateMetadata: (meta: SettableMetadata) => from(updateMetadata(storageRef, meta)),
4161
put: (data: any, metadata?: UploadMetadata) => {
42-
const task = ref.put(data, metadata);
62+
const task = put(storageRef, data, metadata);
4363
return createUploadTask(task);
4464
},
45-
putString: (data: string, format?: StringFormat, metadata?: UploadMetadata) => {
46-
const task = ref.putString(data, format, metadata);
47-
return createUploadTask(task);
65+
// MARK: Breaking change
66+
// previous: AngularFireStorageReference.putString(data: string, format?: string, metadata?: UploadMetadata): AngularFireUploadTask
67+
putString: (data: string, format?: StringFormat, metadata?: UploadMetadata): Observable<UploadResult> => {
68+
const task = putString(storageRef, data, format, metadata);
69+
return from(task);
4870
},
49-
listAll: () => from(ref.listAll())
71+
listAll: () => from(listAll(storageRef))
5072
};
5173
}

src/storage/storage.spec.ts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@ import { AngularFireStorage, AngularFireStorageModule, AngularFireUploadTask, BU
66
import { COMMON_CONFIG } from '../test-config';
77
import { rando } from '../firestore/utils.spec';
88
import { ChangeDetectorRef } from '@angular/core';
9-
import 'firebase/storage';
10-
import firebase from 'firebase/app';
9+
import { UploadTaskSnapshot, getMetadata } from 'firebase/storage';
1110

1211
if (typeof XMLHttpRequest === 'undefined') {
1312
globalThis.XMLHttpRequest = require('xhr2');
@@ -66,7 +65,7 @@ describe('AngularFireStorage', () => {
6665
const ref = afStorage.ref(rando());
6766
const task = ref.put(blob);
6867
let emissionCount = 0;
69-
let lastSnap: firebase.storage.UploadTaskSnapshot;
68+
let lastSnap: UploadTaskSnapshot;
7069
task.snapshotChanges()
7170
.subscribe(
7271
snap => {
@@ -117,7 +116,7 @@ describe('AngularFireStorage', () => {
117116
const ref = afStorage.ref(rando());
118117
const task: AngularFireUploadTask = ref.put(blob);
119118
let emissionCount = 0;
120-
let lastSnap: firebase.storage.UploadTaskSnapshot;
119+
let lastSnap: UploadTaskSnapshot;
121120
task.snapshotChanges().subscribe(snap => {
122121
emissionCount++;
123122
lastSnap = snap;
@@ -156,7 +155,7 @@ describe('AngularFireStorage', () => {
156155
const ref = afStorage.storage.ref(rando());
157156
const task = ref.put(blob);
158157
let emissionCount = 0;
159-
let lastSnap: firebase.storage.UploadTaskSnapshot;
158+
let lastSnap: UploadTaskSnapshot;
160159
task.then(_snap => {
161160
fromTask(task).subscribe(
162161
snap => {
@@ -205,7 +204,7 @@ describe('AngularFireStorage', () => {
205204
forkJoin([task.snapshotChanges()])
206205
.pipe(
207206
// get the metadata download
208-
mergeMap(() => ref.getMetadata()),
207+
mergeMap(() => getMetadata(ref)),
209208
// assert the URL
210209
tap(meta => expect(meta.customMetadata).toEqual({ blah: 'blah' })),
211210
// Delete the file

src/storage/storage.ts

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,8 @@ import {
1111
ɵfirebaseAppFactory,
1212
ɵkeepUnstableUntilFirstFactory
1313
} from '@angular/fire';
14-
import { UploadMetadata } from './interfaces';
15-
import 'firebase/storage';
16-
import firebase from 'firebase/app';
14+
import { UploadMetadata, StorageService } from './interfaces';
15+
import { getStorage, ref } from 'firebase/storage';
1716

1817
export const BUCKET = new InjectionToken<string>('angularfire2.storageBucket');
1918
export const MAX_UPLOAD_RETRY_TIME = new InjectionToken<number>('angularfire2.storage.maxUploadRetryTime');
@@ -30,7 +29,7 @@ export const MAX_OPERATION_RETRY_TIME = new InjectionToken<number>('angularfire2
3029
providedIn: 'any'
3130
})
3231
export class AngularFireStorage {
33-
public readonly storage: firebase.storage.Storage;
32+
public readonly storage: StorageService;
3433

3534
public readonly keepUnstableUntilFirst: <T>(obs: Observable<T>) => Observable<T>;
3635
public readonly schedulers: ɵAngularFireSchedulers;
@@ -50,29 +49,31 @@ export class AngularFireStorage {
5049
const app = ɵfirebaseAppFactory(options, zone, nameOrConfig);
5150

5251
this.storage = ɵfetchInstance(`${app.name}.storage.${storageBucket}`, 'AngularFireStorage', app, () => {
53-
const storage = zone.runOutsideAngular(() => app.storage(storageBucket || undefined));
52+
const storage = zone.runOutsideAngular(() => {
53+
return getStorage(app, storageBucket || undefined);
54+
});
5455
if (maxUploadRetryTime) {
55-
storage.setMaxUploadRetryTime(maxUploadRetryTime);
56+
storage.maxUploadRetryTime = maxUploadRetryTime;
5657
}
5758
if (maxOperationRetryTime) {
58-
storage.setMaxOperationRetryTime(maxOperationRetryTime);
59+
storage.maxOperationRetryTime = maxOperationRetryTime;
5960
}
6061
return storage;
6162
}, [maxUploadRetryTime, maxOperationRetryTime]);
6263
}
6364

6465
ref(path: string) {
65-
return createStorageRef(this.storage.ref(path), this.schedulers, this.keepUnstableUntilFirst);
66+
return createStorageRef(this.storage, ref(this.storage, path), this.schedulers, this.keepUnstableUntilFirst);
6667
}
6768

6869
refFromURL(path: string) {
69-
return createStorageRef(this.storage.refFromURL(path), this.schedulers, this.keepUnstableUntilFirst);
70+
return createStorageRef(this.storage, ref(this.storage, path), this.schedulers, this.keepUnstableUntilFirst);
7071
}
7172

7273
upload(path: string, data: any, metadata?: UploadMetadata) {
73-
const storageRef = this.storage.ref(path);
74-
const ref = createStorageRef(storageRef, this.schedulers, this.keepUnstableUntilFirst);
75-
return ref.put(data, metadata);
74+
const storageRef = ref(this.storage, path);
75+
const afRef = createStorageRef(this.storage, storageRef, this.schedulers, this.keepUnstableUntilFirst);
76+
return afRef.put(data, metadata);
7677
}
7778

7879
}

0 commit comments

Comments
 (0)