diff --git a/externs/firebase-app-externs.js b/externs/firebase-app-externs.js index 04f6605d007..0528fadc718 100644 --- a/externs/firebase-app-externs.js +++ b/externs/firebase-app-externs.js @@ -275,3 +275,27 @@ firebase.Promise.reject = function(error) {}; * @return {!firebase.Promise>} */ firebase.Promise.all = function(values) {}; + +/** + * @template V, E + * @interface + **/ +firebase.Observer = function() {}; + +/** + * @param {?V} value + */ +firebase.Observer.prototype.next = function(value) {}; + +/** + * @param {!E} error + */ +firebase.Observer.prototype.error = function(error) {}; + +firebase.Observer.prototype.complete = function() {}; + +/** @typedef {function(): void} */ +firebase.CompleteFn; + +/** @typedef {function(): void} */ +firebase.Unsubscribe; diff --git a/externs/firebase-app-internal-externs.js b/externs/firebase-app-internal-externs.js index ed0f525daec..038c8b77633 100644 --- a/externs/firebase-app-internal-externs.js +++ b/externs/firebase-app-internal-externs.js @@ -35,23 +35,11 @@ firebase.INTERNAL.extendNamespace = function(props) {}; firebase.INTERNAL.resetNamespace = function() {}; -/** @interface */ -firebase.Observer = function() {}; -/** @param {*} value */ -firebase.Observer.prototype.next = function(value) {}; -/** @param {!Error} error */ -firebase.Observer.prototype.error = function(error) {}; -firebase.Observer.prototype.complete = function() {}; - /** @typedef {function(*): void} */ firebase.NextFn; + /** @typedef {function(!Error): void} */ firebase.ErrorFn; -/** @typedef {function(): void} */ -firebase.CompleteFn; - -/** @typedef {function(): void} */ -firebase.Unsubscribe; /** * @typedef {function((firebase.NextFn|firebase.Observer)=, diff --git a/externs/firebase-auth-externs.js b/externs/firebase-auth-externs.js index b8137f59606..2a2d2b4a4f9 100644 --- a/externs/firebase-auth-externs.js +++ b/externs/firebase-auth-externs.js @@ -870,13 +870,13 @@ firebase.auth.Auth.prototype.fetchProvidersForEmail = function(email) {}; * } * }); * - * @param {!Object|function(?firebase.User)} + * @param {!firebase.Observer|function(?firebase.User)} * nextOrObserver An observer object or a function triggered on change. * @param {function(!firebase.auth.Error)=} error Optional A function * triggered on auth error. - * @param {function()=} completed Optional A function triggered when the + * @param {firebase.CompleteFn=} completed Optional A function triggered when the * observer is removed. - * @return {!function()} The unsubscribe function for the observer. + * @return {!firebase.Unsubscribe} The unsubscribe function for the observer. */ firebase.auth.Auth.prototype.onAuthStateChanged = function( nextOrObserver, error, completed) {}; @@ -894,13 +894,13 @@ firebase.auth.Auth.prototype.onAuthStateChanged = function( * } * }); * - * @param {!Object|function(?firebase.User)} + * @param {!firebase.Observer|function(?firebase.User)} * nextOrObserver An observer object or a function triggered on change. * @param {function(!firebase.auth.Error)=} error Optional A function * triggered on auth error. - * @param {function()=} completed Optional A function triggered when the + * @param {firebase.CompleteFn=} completed Optional A function triggered when the * observer is removed. - * @return {!function()} The unsubscribe function for the observer. + * @return {!firebase.Unsubscribe} The unsubscribe function for the observer. */ firebase.auth.Auth.prototype.onIdTokenChanged = function( nextOrObserver, error, completed) {}; diff --git a/externs/firebase-messaging-externs.js b/externs/firebase-messaging-externs.js index d30a212349f..236d0620fac 100644 --- a/externs/firebase-messaging-externs.js +++ b/externs/firebase-messaging-externs.js @@ -119,10 +119,10 @@ firebase.messaging.Messaging.prototype.getToken = function() {}; * has invalidated your existing token and you need to call `getToken()` * to get a new token. * - * @param {(!function(!Object)|!Object)} nextOrObserver This function, or - * observer object with `next` defined, is called when a token refresh - * has occurred. - * @return {function()} To stop listening for token + * @param {!firebase.Observer|!function(!Object)} + * nextOrObserver This function, or observer object with `next` defined, + * is called when a token refresh has occurred. + * @return {firebase.Unsubscribe} To stop listening for token * refresh events execute this returned function. */ firebase.messaging.Messaging.prototype.onTokenRefresh = @@ -136,10 +136,10 @@ firebase.messaging.Messaging.prototype.onTokenRefresh = * NOTE: These events are dispatched when you have called * `setBackgroundMessageHandler()` in your service worker. * - * @param {(!function(!Object)|!Object)} nextOrObserver This function, or - * observer object with `next` defined, is called when a message is - * received and the user is currently viewing your page. - * @return {function()} To stop listening for messages + * @param {!firebase.Observer|!function(!Object)} + * nextOrObserver This function, or observer object with `next` defined, + * is called when a message is received and the user is currently viewing your page. + * @return {firebase.Unsubscribe} To stop listening for messages * execute this returned function. */ firebase.messaging.Messaging.prototype.onMessage = diff --git a/externs/firebase-storage-externs.js b/externs/firebase-storage-externs.js index 8d569644d0a..5053442068b 100644 --- a/externs/firebase-storage-externs.js +++ b/externs/firebase-storage-externs.js @@ -583,18 +583,19 @@ firebase.storage.UploadTask.prototype.catch = function(onRejected) {}; * }); * * @param {!firebase.storage.TaskEvent} event The event to listen for. - * @param {(?function(!Object)|!Object)=} nextOrObserver The `next` function, - * which gets called for each item in the event stream, or an observer - * object with some or all of these three properties (`next`, `error`, - * `complete`). + * @param {(?firebase.Observer| + * ?function(!Object))=} nextOrObserver + * The `next` function, which gets called for each item in + * the event stream, or an observer object with some or all of these three + * properties (`next`, `error`, `complete`). * @param {?function(!Error)=} error A function that gets called with an Error * if the event stream ends due to an error. - * @param {?function()=} complete A function that gets called if the + * @param {?firebase.CompleteFn=} complete A function that gets called if the * event stream ends normally. * @return { - * !function()| - * !function(?function(!Object),?function(!Error)=,?function()=) - * :!function()} + * !firebase.Unsubscribe| + * !function(?function(!Object),?function(!Error)=,?firebase.CompleteFn=) + * :!firebase.Unsubscribe} * If only the event argument is passed, returns a function you can use to * add callbacks (see the examples above). If more than just the event * argument is passed, returns a function you can call to unregister the diff --git a/typings/app.d.ts b/typings/app.d.ts index 4011112b2b3..8aa5ac7df21 100644 --- a/typings/app.d.ts +++ b/typings/app.d.ts @@ -76,6 +76,20 @@ declare namespace firebase { uid : string ; } + type NextFn = (value: V | null) => void; + + type ErrorFn = (error: E) => void; + + type CompleteFn = () => void; + + type Unsubscribe = () => void; + + interface Observer { + next?: NextFn; + error?: ErrorFn; + complete?: CompleteFn; + } + function app (name ? : string ) : firebase.app.App ; var apps : ( firebase.app.App | null ) [] ; @@ -123,8 +137,8 @@ declare namespace firebase.auth { currentUser : firebase.User | null ; fetchProvidersForEmail (email : string ) : firebase.Promise < any > ; getRedirectResult ( ) : firebase.Promise < any > ; - onAuthStateChanged (nextOrObserver : Object , error ? : (a : firebase.auth.Error ) => any , completed ? : ( ) => any ) : ( ) => any ; - onIdTokenChanged (nextOrObserver : Object , error ? : (a : firebase.auth.Error ) => any , completed ? : ( ) => any ) : ( ) => any ; + onAuthStateChanged (nextOrObserver : firebase.Observer | firebase.NextFn, error ? : firebase.ErrorFn , completed ? : firebase.CompleteFn ) : firebase.Unsubscribe ; + onIdTokenChanged (nextOrObserver : firebase.Observer | firebase.NextFn, error ? : firebase.ErrorFn , completed ? : firebase.CompleteFn ) : firebase.Unsubscribe ; sendPasswordResetEmail (email : string ) : firebase.Promise < any > ; signInAndRetrieveDataWithCredential (credential : firebase.auth.AuthCredential ) : firebase.Promise < any > ; signInAnonymously ( ) : firebase.Promise < any > ; @@ -306,8 +320,8 @@ declare namespace firebase.messaging { interface Messaging { deleteToken (token : string ) : firebase.Promise < any > | null ; getToken ( ) : firebase.Promise < any > | null ; - onMessage (nextOrObserver : Object ) : ( ) => any ; - onTokenRefresh (nextOrObserver : Object ) : ( ) => any ; + onMessage (nextOrObserver : firebase.Observer | firebase.NextFn ) : firebase.Unsubscribe ; + onTokenRefresh (nextOrObserver : firebase.Observer | firebase.NextFn ) : firebase.Unsubscribe ; requestPermission ( ) : firebase.Promise < any > | null ; setBackgroundMessageHandler (callback : (a : Object ) => any ) : any ; useServiceWorker (registration : any ) : any ; @@ -392,7 +406,8 @@ declare namespace firebase.storage { interface UploadTask { cancel ( ) : boolean ; catch (onRejected : (a : Error ) => any ) : firebase.Promise < any > ; - on (event : firebase.storage.TaskEvent , nextOrObserver ? : null | Object , error ? : ( (a : Error ) => any ) | null , complete ? : ( ( ) => any ) | null ) : Function ; + on (event : firebase.storage.TaskEvent ) : ( nextOrObserver ? : firebase.Observer | firebase.NextFn , error ? : firebase.ErrorFn | null , complete ? : firebase.CompleteFn | null ) => firebase.Unsubscribe ; + on (event : firebase.storage.TaskEvent , nextOrObserver ? : firebase.Observer | firebase.NextFn , error ? : firebase.ErrorFn | null , complete ? : firebase.CompleteFn | null ) : firebase.Unsubscribe ; pause ( ) : boolean ; resume ( ) : boolean ; snapshot : firebase.storage.UploadTaskSnapshot ; diff --git a/typings/firebase.d.ts b/typings/firebase.d.ts index f32bafca123..0b379f2b918 100644 --- a/typings/firebase.d.ts +++ b/typings/firebase.d.ts @@ -76,6 +76,20 @@ declare namespace firebase { uid : string ; } + type NextFn = (value: V | null) => void; + + type ErrorFn = (error: E) => void; + + type CompleteFn = () => void; + + type Unsubscribe = () => void; + + interface Observer { + next?: NextFn; + error?: ErrorFn; + complete?: CompleteFn; + } + function app (name ? : string ) : firebase.app.App ; var apps : ( firebase.app.App | null ) [] ; @@ -123,8 +137,8 @@ declare namespace firebase.auth { currentUser : firebase.User | null ; fetchProvidersForEmail (email : string ) : firebase.Promise < any > ; getRedirectResult ( ) : firebase.Promise < any > ; - onAuthStateChanged (nextOrObserver : Object , error ? : (a : firebase.auth.Error ) => any , completed ? : ( ) => any ) : ( ) => any ; - onIdTokenChanged (nextOrObserver : Object , error ? : (a : firebase.auth.Error ) => any , completed ? : ( ) => any ) : ( ) => any ; + onAuthStateChanged (nextOrObserver : firebase.Observer | firebase.NextFn, error ? : firebase.ErrorFn , completed ? : firebase.CompleteFn ) : firebase.Unsubscribe ; + onIdTokenChanged (nextOrObserver : firebase.Observer | firebase.NextFn, error ? : firebase.ErrorFn , completed ? : firebase.CompleteFn ) : firebase.Unsubscribe ; sendPasswordResetEmail (email : string ) : firebase.Promise < any > ; signInAndRetrieveDataWithCredential (credential : firebase.auth.AuthCredential ) : firebase.Promise < any > ; signInAnonymously ( ) : firebase.Promise < any > ; @@ -306,8 +320,8 @@ declare namespace firebase.messaging { interface Messaging { deleteToken (token : string ) : firebase.Promise < any > | null ; getToken ( ) : firebase.Promise < any > | null ; - onMessage (nextOrObserver : Object ) : ( ) => any ; - onTokenRefresh (nextOrObserver : Object ) : ( ) => any ; + onMessage (nextOrObserver : firebase.Observer | firebase.NextFn ) : firebase.Unsubscribe ; + onTokenRefresh (nextOrObserver : firebase.Observer | firebase.NextFn ) : firebase.Unsubscribe ; requestPermission ( ) : firebase.Promise < any > | null ; setBackgroundMessageHandler (callback : (a : Object ) => any ) : any ; useServiceWorker (registration : any ) : any ; @@ -392,7 +406,8 @@ declare namespace firebase.storage { interface UploadTask { cancel ( ) : boolean ; catch (onRejected : (a : Error ) => any ) : firebase.Promise < any > ; - on (event : firebase.storage.TaskEvent , nextOrObserver ? : null | Object , error ? : ( (a : Error ) => any ) | null , complete ? : ( ( ) => any ) | null ) : Function ; + on (event : firebase.storage.TaskEvent ) : ( nextOrObserver ? : firebase.Observer | firebase.NextFn , error ? : firebase.ErrorFn | null , complete ? : firebase.CompleteFn | null ) => firebase.Unsubscribe ; + on (event : firebase.storage.TaskEvent , nextOrObserver ? : firebase.Observer | firebase.NextFn , error ? : firebase.ErrorFn | null , complete ? : firebase.CompleteFn | null ) : firebase.Unsubscribe ; pause ( ) : boolean ; resume ( ) : boolean ; snapshot : firebase.storage.UploadTaskSnapshot ;