Skip to content

Commit a81abd9

Browse files
committed
Migrate storage to component framework
1 parent 2eec800 commit a81abd9

File tree

14 files changed

+178
-77
lines changed

14 files changed

+178
-77
lines changed

packages/app-types/index.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,4 +102,4 @@ export interface FirebaseNamespace {
102102

103103
// The current SDK version.
104104
SDK_VERSION: string;
105-
}
105+
}

packages/app/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ const initializeApp = firebaseNamespace.initializeApp;
4444
// TODO: This disable can be removed and the 'ignoreRestArgs' option added to
4545
// the no-explicit-any rule when ESlint releases it.
4646
// eslint-disable-next-line @typescript-eslint/no-explicit-any
47-
firebaseNamespace.initializeApp = function(...args: any) {
47+
firebaseNamespace.initializeApp = function (...args: any) {
4848
// Environment check before initializing app
4949
// Do the check in initializeApp, so people have a chance to disable it by setting logLevel
5050
// in @firebase/logger

packages/app/src/firebaseNamespaceCore.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ export function createFirebaseNamespaceCore(
213213
// TODO: The eslint disable can be removed and the 'ignoreRestArgs'
214214
// option added to the no-explicit-any rule when ESlint releases it.
215215
// eslint-disable-next-line @typescript-eslint/no-explicit-any
216-
function(...args: any) {
216+
function (...args: any) {
217217
const serviceFxn = this._getService.bind(this, componentName);
218218
return serviceFxn.apply(
219219
this,

packages/app/test/firebaseApp.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@ function firebaseAppTests(
315315
}
316316

317317
class TestService implements FirebaseService {
318-
constructor(private app_: FirebaseApp, public instanceIdentifier?: string) {}
318+
constructor(private app_: FirebaseApp, public instanceIdentifier?: string) { }
319319

320320
// TODO(koss): Shouldn't this just be an added method on
321321
// the service instance?
@@ -342,4 +342,4 @@ function createTestComponent(
342342
);
343343
component.setMultipleInstances(multiInstances);
344344
return component;
345-
}
345+
}

packages/auth/src/exports_auth.js

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -616,11 +616,11 @@ fireauth.exportlib.exportFunction(
616616
fireauth.ActionCodeURL.parseLink, [fireauth.args.string('link')]);
617617

618618

619-
(function() {
619+
(function () {
620620
if (typeof firebase === 'undefined' || !firebase.INTERNAL ||
621621
!firebase.INTERNAL.registerComponent) {
622622
throw new Error('Cannot find the firebase namespace; be sure to include ' +
623-
'firebase-app.js before this library.');
623+
'firebase-app.js before this library.');
624624
} else {
625625
var namespace = {
626626
// Exports firebase.auth.ActionCodeInfo.Operation.
@@ -637,36 +637,36 @@ fireauth.exportlib.exportFunction(
637637
'Error': fireauth.AuthError
638638
};
639639
fireauth.exportlib.exportFunction(namespace,
640-
'EmailAuthProvider', fireauth.EmailAuthProvider, []);
640+
'EmailAuthProvider', fireauth.EmailAuthProvider, []);
641641
fireauth.exportlib.exportFunction(namespace,
642-
'FacebookAuthProvider', fireauth.FacebookAuthProvider, []);
642+
'FacebookAuthProvider', fireauth.FacebookAuthProvider, []);
643643
fireauth.exportlib.exportFunction(namespace,
644-
'GithubAuthProvider', fireauth.GithubAuthProvider, []);
644+
'GithubAuthProvider', fireauth.GithubAuthProvider, []);
645645
fireauth.exportlib.exportFunction(namespace,
646-
'GoogleAuthProvider', fireauth.GoogleAuthProvider, []);
646+
'GoogleAuthProvider', fireauth.GoogleAuthProvider, []);
647647
fireauth.exportlib.exportFunction(namespace,
648-
'TwitterAuthProvider', fireauth.TwitterAuthProvider, []);
648+
'TwitterAuthProvider', fireauth.TwitterAuthProvider, []);
649649
fireauth.exportlib.exportFunction(namespace,
650-
'OAuthProvider', fireauth.OAuthProvider, [
651-
fireauth.args.string('providerId')
652-
]);
650+
'OAuthProvider', fireauth.OAuthProvider, [
651+
fireauth.args.string('providerId')
652+
]);
653653
fireauth.exportlib.exportFunction(namespace,
654-
'SAMLAuthProvider', fireauth.SAMLAuthProvider, [
655-
fireauth.args.string('providerId')
656-
]);
654+
'SAMLAuthProvider', fireauth.SAMLAuthProvider, [
655+
fireauth.args.string('providerId')
656+
]);
657657
fireauth.exportlib.exportFunction(namespace,
658-
'PhoneAuthProvider', fireauth.PhoneAuthProvider, [
659-
fireauth.args.firebaseAuth(true)
660-
]);
658+
'PhoneAuthProvider', fireauth.PhoneAuthProvider, [
659+
fireauth.args.firebaseAuth(true)
660+
]);
661661
fireauth.exportlib.exportFunction(namespace,
662-
'RecaptchaVerifier', fireauth.RecaptchaVerifier, [
663-
fireauth.args.or(
664-
fireauth.args.string(),
665-
fireauth.args.element(),
666-
'recaptchaContainer'),
667-
fireauth.args.object('recaptchaParameters', true),
668-
fireauth.args.firebaseApp(true)
669-
]);
662+
'RecaptchaVerifier', fireauth.RecaptchaVerifier, [
663+
fireauth.args.or(
664+
fireauth.args.string(),
665+
fireauth.args.element(),
666+
'recaptchaContainer'),
667+
fireauth.args.object('recaptchaParameters', true),
668+
fireauth.args.firebaseApp(true)
669+
]);
670670
fireauth.exportlib.exportFunction(namespace,
671671
'ActionCodeURL', fireauth.ActionCodeURL, []);
672672

@@ -709,4 +709,4 @@ fireauth.exportlib.exportFunction(
709709
'User': fireauth.AuthUser
710710
});
711711
}
712-
})();
712+
})();

packages/storage/index.ts

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,31 +16,36 @@
1616
*/
1717

1818
import firebase from '@firebase/app';
19-
import { FirebaseApp } from '@firebase/app-types';
20-
import {
21-
FirebaseServiceFactory,
22-
_FirebaseNamespace
23-
} from '@firebase/app-types/private';
19+
import { _FirebaseNamespace } from '@firebase/app-types/private';
2420
import { StringFormat } from './src/implementation/string';
2521
import { TaskEvent, TaskState } from './src/implementation/taskenums';
2622

2723
import { XhrIoPool } from './src/implementation/xhriopool';
2824
import { Reference } from './src/reference';
2925
import { Service } from './src/service';
3026
import * as types from '@firebase/storage-types';
27+
import {
28+
Component,
29+
ComponentType,
30+
ComponentContainer
31+
} from '@firebase/component';
3132

3233
/**
3334
* Type constant for Firebase Storage.
3435
*/
3536
const STORAGE_TYPE = 'storage';
3637

3738
function factory(
38-
app: FirebaseApp,
39-
unused: unknown,
39+
container: ComponentContainer,
4040
url?: string
4141
): types.FirebaseStorage {
42+
// Dependencies
43+
const app = container.getProvider('app').getImmediate();
44+
const authProvider = container.getProvider('auth-internal');
45+
4246
return (new Service(
4347
app,
48+
authProvider,
4449
new XhrIoPool(),
4550
url
4651
) as unknown) as types.FirebaseStorage;
@@ -55,13 +60,10 @@ export function registerStorage(instance: _FirebaseNamespace): void {
5560
Storage: Service,
5661
Reference
5762
};
58-
instance.INTERNAL.registerService(
59-
STORAGE_TYPE,
60-
factory as FirebaseServiceFactory,
61-
namespaceExports,
62-
undefined,
63-
// Allow multiple storage instances per app.
64-
true
63+
instance.INTERNAL.registerComponent(
64+
new Component(STORAGE_TYPE, factory, ComponentType.PUBLIC)
65+
.setServiceProps(namespaceExports)
66+
.setMultipleInstances(true)
6567
);
6668
}
6769

packages/storage/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
"dependencies": {
2323
"@firebase/storage-types": "0.3.5",
2424
"@firebase/util": "0.2.31",
25+
"@firebase/component": "0.1.0",
2526
"tslib": "1.10.0"
2627
},
2728
"peerDependencies": {

packages/storage/src/implementation/authwrapper.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ import {
3131
_FirebaseApp,
3232
FirebaseAuthTokenData
3333
} from '@firebase/app-types/private';
34+
import { Provider } from '@firebase/component';
35+
import { FirebaseAuthInternal } from '@firebase/auth-interop-types';
3436

3537
/**
3638
* @param app If null, getAuthToken always resolves with null.
@@ -40,6 +42,7 @@ import {
4042
*/
4143
export class AuthWrapper {
4244
private app_: FirebaseApp | null;
45+
private authProvider: Provider<FirebaseAuthInternal>;
4346
private bucket_: string | null = null;
4447

4548
private storageRefMaker_: (p1: AuthWrapper, p2: Location) => Reference;
@@ -53,6 +56,7 @@ export class AuthWrapper {
5356

5457
constructor(
5558
app: FirebaseApp | null,
59+
authProvider: Provider<FirebaseAuthInternal>,
5660
maker: (p1: AuthWrapper, p2: Location) => Reference,
5761
requestMaker: requestMaker,
5862
service: Service,
@@ -65,6 +69,7 @@ export class AuthWrapper {
6569
this.bucket_ = AuthWrapper.extractBucket_(options);
6670
}
6771
}
72+
this.authProvider = authProvider;
6873
this.storageRefMaker_ = maker;
6974
this.requestMaker_ = requestMaker;
7075
this.pool_ = pool;
@@ -84,14 +89,9 @@ export class AuthWrapper {
8489
}
8590

8691
getAuthToken(): Promise<string | null> {
87-
// TODO(andysoto): remove ifDef checks after firebase-app implements stubs
88-
// (b/28673818).
89-
if (
90-
this.app_ !== null &&
91-
type.isDef((this.app_ as _FirebaseApp).INTERNAL) &&
92-
type.isDef((this.app_ as _FirebaseApp).INTERNAL.getToken)
93-
) {
94-
return (this.app_ as _FirebaseApp).INTERNAL.getToken().then(
92+
const auth = this.authProvider.getImmediate(undefined, { optional: true });
93+
if (auth) {
94+
return auth.getToken().then(
9595
(response: FirebaseAuthTokenData | null): string | null => {
9696
if (response !== null) {
9797
return response.accessToken;

packages/storage/src/service.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ import { Location } from './implementation/location';
2222
import * as RequestExports from './implementation/request';
2323
import { XhrIoPool } from './implementation/xhriopool';
2424
import { Reference } from './reference';
25+
import { Provider } from '@firebase/component';
26+
import { FirebaseAuthInternal } from '@firebase/auth-interop-types';
2527

2628
/**
2729
* A service that provides firebaseStorage.Reference instances.
@@ -35,12 +37,18 @@ export class Service {
3537
private bucket_: Location | null = null;
3638
private internals_: ServiceInternals;
3739

38-
constructor(app: FirebaseApp, pool: XhrIoPool, url?: string) {
40+
constructor(
41+
app: FirebaseApp,
42+
authProvider: Provider<FirebaseAuthInternal>,
43+
pool: XhrIoPool,
44+
url?: string
45+
) {
3946
function maker(authWrapper: AuthWrapper, loc: Location): Reference {
4047
return new Reference(authWrapper, loc);
4148
}
4249
this.authWrapper_ = new AuthWrapper(
4350
app,
51+
authProvider,
4452
maker,
4553
RequestExports.makeRequest,
4654
this,

packages/storage/test/reference.test.ts

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,16 @@ import { Service } from '../src/service';
2626
import * as testShared from './testshared';
2727
import { SendHook, TestingXhrIo } from './xhrio';
2828
import { DEFAULT_HOST } from '../src/implementation/constants';
29+
import { FirebaseAuthInternal } from '@firebase/auth-interop-types';
30+
import { Provider } from '@firebase/component';
31+
2932
/* eslint-disable @typescript-eslint/no-floating-promises */
30-
function makeFakeService(app: FirebaseApp, sendHook: SendHook): Service {
31-
return new Service(app, testShared.makePool(sendHook));
33+
function makeFakeService(
34+
app: FirebaseApp,
35+
authProvider: Provider<FirebaseAuthInternal>,
36+
sendHook: SendHook
37+
): Service {
38+
return new Service(app, authProvider, testShared.makePool(sendHook));
3239
}
3340

3441
function makeStorage(url: string): Reference {
@@ -38,6 +45,7 @@ function makeStorage(url: string): Reference {
3845

3946
const authWrapper = new AuthWrapper(
4047
null,
48+
testShared.emptyAuthProvider,
4149
maker,
4250
makeRequest,
4351
({} as any) as Service,
@@ -190,7 +198,11 @@ describe('Firebase Storage > Reference', () => {
190198
done();
191199
}
192200

193-
const service = makeFakeService(testShared.fakeAppNoAuth, newSend);
201+
const service = makeFakeService(
202+
testShared.fakeApp,
203+
testShared.emptyAuthProvider,
204+
newSend
205+
);
194206
const ref = service.refFromURL('gs://test-bucket');
195207
ref.child('foo').getMetadata();
196208
});
@@ -212,7 +224,11 @@ describe('Firebase Storage > Reference', () => {
212224
done();
213225
}
214226

215-
const service = makeFakeService(testShared.fakeApp, newSend);
227+
const service = makeFakeService(
228+
testShared.fakeApp,
229+
testShared.fakeAuthProvider,
230+
newSend
231+
);
216232
const ref = service.refFromURL('gs://test-bucket');
217233
ref.child('foo').getMetadata();
218234
});

packages/storage/test/requests.test.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,11 @@ import { XhrIoPool } from '../src/implementation/xhriopool';
2828
import { Metadata } from '../src/metadata';
2929
import { Reference } from '../src/reference';
3030
import { Service } from '../src/service';
31-
import { assertObjectIncludes, fakeXhrIo } from './testshared';
31+
import {
32+
assertObjectIncludes,
33+
fakeXhrIo,
34+
fakeAuthProvider
35+
} from './testshared';
3236
import {
3337
DEFAULT_HOST,
3438
CONFIG_STORAGE_BUCKET_KEY
@@ -61,6 +65,7 @@ describe('Firebase Storage > Requests', () => {
6165

6266
const authWrapper = new AuthWrapper(
6367
mockApp,
68+
fakeAuthProvider,
6469
(authWrapper, loc) => {
6570
return new Reference(authWrapper, loc);
6671
},

0 commit comments

Comments
 (0)