Skip to content

Commit 496ca88

Browse files
committed
Migrate Database to component framework
1 parent 086df99 commit 496ca88

File tree

9 files changed

+187
-172
lines changed

9 files changed

+187
-172
lines changed

packages/auth/src/exports_auth.js

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -620,7 +620,7 @@ fireauth.exportlib.exportFunction(
620620
if (typeof firebase === 'undefined' || !firebase.INTERNAL ||
621621
!firebase.INTERNAL.registerService) {
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
/** @type {!firebase.ServiceFactory} */
626626
var factory = function(app, extendApp) {
@@ -654,36 +654,36 @@ fireauth.exportlib.exportFunction(
654654
'Error': fireauth.AuthError
655655
};
656656
fireauth.exportlib.exportFunction(namespace,
657-
'EmailAuthProvider', fireauth.EmailAuthProvider, []);
657+
'EmailAuthProvider', fireauth.EmailAuthProvider, []);
658658
fireauth.exportlib.exportFunction(namespace,
659-
'FacebookAuthProvider', fireauth.FacebookAuthProvider, []);
659+
'FacebookAuthProvider', fireauth.FacebookAuthProvider, []);
660660
fireauth.exportlib.exportFunction(namespace,
661-
'GithubAuthProvider', fireauth.GithubAuthProvider, []);
661+
'GithubAuthProvider', fireauth.GithubAuthProvider, []);
662662
fireauth.exportlib.exportFunction(namespace,
663-
'GoogleAuthProvider', fireauth.GoogleAuthProvider, []);
663+
'GoogleAuthProvider', fireauth.GoogleAuthProvider, []);
664664
fireauth.exportlib.exportFunction(namespace,
665-
'TwitterAuthProvider', fireauth.TwitterAuthProvider, []);
665+
'TwitterAuthProvider', fireauth.TwitterAuthProvider, []);
666666
fireauth.exportlib.exportFunction(namespace,
667-
'OAuthProvider', fireauth.OAuthProvider, [
668-
fireauth.args.string('providerId')
669-
]);
667+
'OAuthProvider', fireauth.OAuthProvider, [
668+
fireauth.args.string('providerId')
669+
]);
670670
fireauth.exportlib.exportFunction(namespace,
671-
'SAMLAuthProvider', fireauth.SAMLAuthProvider, [
672-
fireauth.args.string('providerId')
673-
]);
671+
'SAMLAuthProvider', fireauth.SAMLAuthProvider, [
672+
fireauth.args.string('providerId')
673+
]);
674674
fireauth.exportlib.exportFunction(namespace,
675-
'PhoneAuthProvider', fireauth.PhoneAuthProvider, [
676-
fireauth.args.firebaseAuth(true)
677-
]);
675+
'PhoneAuthProvider', fireauth.PhoneAuthProvider, [
676+
fireauth.args.firebaseAuth(true)
677+
]);
678678
fireauth.exportlib.exportFunction(namespace,
679-
'RecaptchaVerifier', fireauth.RecaptchaVerifier, [
680-
fireauth.args.or(
681-
fireauth.args.string(),
682-
fireauth.args.element(),
683-
'recaptchaContainer'),
684-
fireauth.args.object('recaptchaParameters', true),
685-
fireauth.args.firebaseApp(true)
686-
]);
679+
'RecaptchaVerifier', fireauth.RecaptchaVerifier, [
680+
fireauth.args.or(
681+
fireauth.args.string(),
682+
fireauth.args.element(),
683+
'recaptchaContainer'),
684+
fireauth.args.object('recaptchaParameters', true),
685+
fireauth.args.firebaseApp(true)
686+
]);
687687
fireauth.exportlib.exportFunction(namespace,
688688
'ActionCodeURL', fireauth.ActionCodeURL, []);
689689

packages/database/index.node.ts

Lines changed: 60 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
*/
1717

1818
import { FirebaseNamespace, FirebaseApp } from '@firebase/app-types';
19-
import { _FirebaseNamespace } from '@firebase/app-types/private';
19+
import { _FirebaseNamespace, _FirebaseApp } from '@firebase/app-types/private';
2020
import { Database } from './src/api/Database';
2121
import { DataSnapshot } from './src/api/DataSnapshot';
2222
import { Query } from './src/api/Query';
@@ -30,6 +30,13 @@ import { setSDKVersion } from './src/core/version';
3030
import { CONSTANTS, isNodeSdk } from '@firebase/util';
3131
import { setWebSocketImpl } from './src/realtime/WebSocketConnection';
3232
import { Client } from 'faye-websocket';
33+
import {
34+
Component,
35+
ComponentType,
36+
Provider,
37+
ComponentContainer
38+
} from '@firebase/component';
39+
import { FirebaseAuthInternal } from '@firebase/auth-interop-types';
3340

3441
setWebSocketImpl(Client);
3542

@@ -51,8 +58,28 @@ export function initStandalone(app: FirebaseApp, url: string, version: string) {
5158
CONSTANTS.NODE_ADMIN = true;
5259
setSDKVersion(version);
5360

61+
/**
62+
* Create a 'auth-internal' component using firebase-admin-node's implementation
63+
* that implements FirebaseAuthInternal.
64+
* ComponentContainer('database-admin') is just a placeholder that doesn't perform
65+
* any actual function.
66+
*/
67+
const authProvider = new Provider<FirebaseAuthInternal>(
68+
'auth-internal',
69+
new ComponentContainer('database-admin')
70+
);
71+
authProvider.setComponent(
72+
new Component(
73+
'auth-internal',
74+
// firebase-admin-node's app.INTERNAL implements FirebaseAuthInternal interface
75+
// eslint-disable-next-line @eslint-tslint/no-explicit-any
76+
() => (app as any).INTERNAL,
77+
ComponentType.PRIVATE
78+
)
79+
);
80+
5481
return {
55-
instance: RepoManager.getInstance().databaseFromApp(app, url),
82+
instance: RepoManager.getInstance().databaseFromApp(app, authProvider, url),
5683
namespace: {
5784
Reference,
5885
Query,
@@ -71,22 +98,37 @@ export function registerDatabase(instance: FirebaseNamespace) {
7198
setSDKVersion(instance.SDK_VERSION);
7299

73100
// Register the Database Service with the 'firebase' namespace.
74-
const namespace = (instance as _FirebaseNamespace).INTERNAL.registerService(
75-
'database',
76-
(app, unused, url) => RepoManager.getInstance().databaseFromApp(app, url),
77-
// firebase.database namespace properties
78-
{
79-
Reference,
80-
Query,
81-
Database,
82-
DataSnapshot,
83-
enableLogging,
84-
INTERNAL,
85-
ServerValue,
86-
TEST_ACCESS
87-
},
88-
null,
89-
true
101+
const namespace = (instance as _FirebaseNamespace).INTERNAL.registerComponent(
102+
new Component(
103+
'database',
104+
(container, url) => {
105+
/* Dependencies */
106+
// getImmediate for FirebaseApp will always succeed
107+
const app = container.getProvider('app').getImmediate();
108+
const authProvider = container.getProvider('auth-internal');
109+
110+
return RepoManager.getInstance().databaseFromApp(
111+
app,
112+
authProvider,
113+
url
114+
);
115+
},
116+
ComponentType.PUBLIC
117+
)
118+
.setServiceProps(
119+
// firebase.database namespace properties
120+
{
121+
Reference,
122+
Query,
123+
Database,
124+
DataSnapshot,
125+
enableLogging,
126+
INTERNAL,
127+
ServerValue,
128+
TEST_ACCESS
129+
}
130+
)
131+
.setMultipleInstances(true)
90132
);
91133

92134
if (isNodeSdk()) {

packages/database/index.ts

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import * as TEST_ACCESS from './src/api/test_access';
2929
import { isNodeSdk } from '@firebase/util';
3030
import * as types from '@firebase/database-types';
3131
import { setSDKVersion } from './src/core/version';
32+
import { Component, ComponentType } from '@firebase/component';
3233

3334
const ServerValue = Database.ServerValue;
3435

@@ -37,22 +38,37 @@ export function registerDatabase(instance: FirebaseNamespace) {
3738
setSDKVersion(instance.SDK_VERSION);
3839

3940
// Register the Database Service with the 'firebase' namespace.
40-
const namespace = (instance as _FirebaseNamespace).INTERNAL.registerService(
41-
'database',
42-
(app, unused, url) => RepoManager.getInstance().databaseFromApp(app, url),
43-
// firebase.database namespace properties
44-
{
45-
Reference,
46-
Query,
47-
Database,
48-
DataSnapshot,
49-
enableLogging,
50-
INTERNAL,
51-
ServerValue,
52-
TEST_ACCESS
53-
},
54-
null,
55-
true
41+
const namespace = (instance as _FirebaseNamespace).INTERNAL.registerComponent(
42+
new Component(
43+
'database',
44+
(container, url) => {
45+
/* Dependencies */
46+
// getImmediate for FirebaseApp will always succeed
47+
const app = container.getProvider('app').getImmediate();
48+
const authProvider = container.getProvider('auth-internal');
49+
50+
return RepoManager.getInstance().databaseFromApp(
51+
app,
52+
authProvider,
53+
url
54+
);
55+
},
56+
ComponentType.PUBLIC
57+
)
58+
.setServiceProps(
59+
// firebase.database namespace properties
60+
{
61+
Reference,
62+
Query,
63+
Database,
64+
DataSnapshot,
65+
enableLogging,
66+
INTERNAL,
67+
ServerValue,
68+
TEST_ACCESS
69+
}
70+
)
71+
.setMultipleInstances(true)
5672
);
5773

5874
if (isNodeSdk()) {

packages/database/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
"test": "yarn test:emulator",
1717
"test:all": "run-p test:browser test:node",
1818
"test:browser": "karma start --single-run",
19-
"test:node": "TS_NODE_CACHE=NO TS_NODE_COMPILER_OPTIONS='{\"module\":\"commonjs\"}' nyc --reporter lcovonly -- mocha 'test/{,!(browser)/**/}*.test.ts' --file index.node.ts --opts ../../config/mocha.node.opts",
19+
"test:node": "TS_NODE_FILES=true TS_NODE_CACHE=NO TS_NODE_COMPILER_OPTIONS='{\"module\":\"commonjs\"}' nyc --reporter lcovonly -- mocha 'test/{,!(browser)/**/}*.test.ts' --file index.node.ts --opts ../../config/mocha.node.opts",
2020
"test:emulator": "ts-node --compiler-options='{\"module\":\"commonjs\"}' ../../scripts/emulator-testing/database-test-runner.ts",
2121
"prepare": "yarn build"
2222
},

packages/database/src/core/AuthTokenProvider.ts

Lines changed: 37 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -15,48 +15,65 @@
1515
* limitations under the License.
1616
*/
1717

18-
import { FirebaseApp } from '@firebase/app-types';
1918
import { FirebaseAuthTokenData } from '@firebase/app-types/private';
19+
import { FirebaseAuthInternal } from '@firebase/auth-interop-types';
20+
import { Provider } from '@firebase/component';
2021
import { log, warn } from './util/util';
22+
import { FirebaseApp } from '@firebase/app-types';
2123

2224
/**
2325
* Abstraction around FirebaseApp's token fetching capabilities.
2426
*/
2527
export class AuthTokenProvider {
26-
/**
27-
* @param {!FirebaseApp} app_
28-
*/
29-
constructor(private app_: FirebaseApp) {}
28+
private auth_: FirebaseAuthInternal | null = null;
29+
constructor(
30+
private app_: FirebaseApp,
31+
private authProvider_: Provider<FirebaseAuthInternal>
32+
) {
33+
this.auth_ = authProvider_.getImmediate({ optional: true });
34+
if (!this.auth_) {
35+
authProvider_.get().then(auth => (this.auth_ = auth));
36+
}
37+
}
3038

3139
/**
3240
* @param {boolean} forceRefresh
3341
* @return {!Promise<FirebaseAuthTokenData>}
3442
*/
3543
getToken(forceRefresh: boolean): Promise<FirebaseAuthTokenData> {
36-
return this.app_['INTERNAL']['getToken'](forceRefresh).then(
37-
null,
38-
// .catch
39-
function(error) {
40-
// TODO: Need to figure out all the cases this is raised and whether
41-
// this makes sense.
42-
if (error && error.code === 'auth/token-not-initialized') {
43-
log('Got auth/token-not-initialized error. Treating as null token.');
44-
return null;
45-
} else {
46-
return Promise.reject(error);
47-
}
44+
if (!this.auth_) {
45+
return Promise.resolve(null);
46+
}
47+
48+
return this.auth_.getToken(forceRefresh).catch(function(error) {
49+
// TODO: Need to figure out all the cases this is raised and whether
50+
// this makes sense.
51+
if (error && error.code === 'auth/token-not-initialized') {
52+
log('Got auth/token-not-initialized error. Treating as null token.');
53+
return null;
54+
} else {
55+
return Promise.reject(error);
4856
}
49-
);
57+
});
5058
}
5159

5260
addTokenChangeListener(listener: (token: string | null) => void) {
5361
// TODO: We might want to wrap the listener and call it with no args to
5462
// avoid a leaky abstraction, but that makes removing the listener harder.
55-
this.app_['INTERNAL']['addAuthTokenListener'](listener);
63+
if (this.auth_) {
64+
this.auth_.addAuthTokenListener(listener);
65+
} else {
66+
setTimeout(() => listener(null), 0);
67+
this.authProvider_
68+
.get()
69+
.then(auth => auth.addAuthTokenListener(listener));
70+
}
5671
}
5772

5873
removeTokenChangeListener(listener: (token: string | null) => void) {
59-
this.app_['INTERNAL']['removeAuthTokenListener'](listener);
74+
this.authProvider_
75+
.get()
76+
.then(auth => auth.removeAuthTokenListener(listener));
6077
}
6178

6279
notifyForInvalidToken() {

packages/database/src/core/Repo.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ import { EventRegistration } from './view/EventRegistration';
4444
import { StatsCollection } from './stats/StatsCollection';
4545
import { Event } from './view/Event';
4646
import { Node } from './snap/Node';
47+
import { FirebaseAuthInternal } from '@firebase/auth-interop-types';
48+
import { Provider } from '@firebase/component';
4749

4850
const INTERRUPT_REASON = 'repo_interrupt';
4951

@@ -79,9 +81,10 @@ export class Repo {
7981
constructor(
8082
public repoInfo_: RepoInfo,
8183
forceRestClient: boolean,
82-
public app: FirebaseApp
84+
public app: FirebaseApp,
85+
authProvider: Provider<FirebaseAuthInternal>
8386
) {
84-
const authTokenProvider = new AuthTokenProvider(app);
87+
const authTokenProvider = new AuthTokenProvider(app, authProvider);
8588

8689
this.stats_ = StatsManager.getCollection(repoInfo_);
8790

0 commit comments

Comments
 (0)