@@ -830,18 +830,20 @@ firebase.deleteUser = function (arg) {
830830} ;
831831
832832firebase . _addObservers = function ( to , updateCallback ) {
833- to . observeEventTypeWithBlock ( FIRDataEventType . FIRDataEventTypeChildAdded , function ( snapshot ) {
833+ var listeners = [ ] ;
834+ listeners . push ( to . observeEventTypeWithBlock ( FIRDataEventType . FIRDataEventTypeChildAdded , function ( snapshot ) {
834835 updateCallback ( firebase . getCallbackData ( 'ChildAdded' , snapshot ) ) ;
835- } ) ;
836- to . observeEventTypeWithBlock ( FIRDataEventType . FIRDataEventTypeChildRemoved , function ( snapshot ) {
836+ } ) ) ;
837+ listeners . push ( to . observeEventTypeWithBlock ( FIRDataEventType . FIRDataEventTypeChildRemoved , function ( snapshot ) {
837838 updateCallback ( firebase . getCallbackData ( 'ChildRemoved' , snapshot ) ) ;
838- } ) ;
839- to . observeEventTypeWithBlock ( FIRDataEventType . FIRDataEventTypeChildChanged , function ( snapshot ) {
839+ } ) ) ;
840+ listeners . push ( to . observeEventTypeWithBlock ( FIRDataEventType . FIRDataEventTypeChildChanged , function ( snapshot ) {
840841 updateCallback ( firebase . getCallbackData ( 'ChildChanged' , snapshot ) ) ;
841- } ) ;
842- to . observeEventTypeWithBlock ( FIRDataEventType . FIRDataEventTypeChildMoved , function ( snapshot ) {
842+ } ) ) ;
843+ listeners . push ( to . observeEventTypeWithBlock ( FIRDataEventType . FIRDataEventTypeChildMoved , function ( snapshot ) {
843844 updateCallback ( firebase . getCallbackData ( 'ChildMoved' , snapshot ) ) ;
844- } ) ;
845+ } ) ) ;
846+ return listeners ;
845847} ;
846848
847849firebase . keepInSync = function ( path , switchOn ) {
@@ -864,8 +866,10 @@ firebase.addChildEventListener = function (updateCallback, path) {
864866 if ( path !== undefined ) {
865867 where = firebase . instance . childByAppendingPath ( path ) ;
866868 }
867- firebase . _addObservers ( where , updateCallback ) ;
868- resolve ( ) ;
869+ resolve ( {
870+ path : path ,
871+ listeners : firebase . _addObservers ( where , updateCallback )
872+ } ) ;
869873 } catch ( ex ) {
870874 console . log ( "Error in firebase.addChildEventListener: " + ex ) ;
871875 reject ( ex ) ;
@@ -880,7 +884,7 @@ firebase.addValueEventListener = function (updateCallback, path) {
880884 if ( path !== undefined ) {
881885 where = firebase . instance . childByAppendingPath ( path ) ;
882886 }
883- where . observeEventTypeWithBlockWithCancelBlock (
887+ var listener = where . observeEventTypeWithBlockWithCancelBlock (
884888 FIRDataEventType . FIRDataEventTypeValue ,
885889 function ( snapshot ) {
886890 updateCallback ( firebase . getCallbackData ( 'ValueChanged' , snapshot ) ) ;
@@ -890,14 +894,54 @@ firebase.addValueEventListener = function (updateCallback, path) {
890894 error : firebaseError . localizedDescription
891895 } ) ;
892896 } ) ;
893- resolve ( ) ;
897+ resolve ( {
898+ path : path ,
899+ listeners : [ listener ]
900+ } ) ;
894901 } catch ( ex ) {
895902 console . log ( "Error in firebase.addChildEventListener: " + ex ) ;
896903 reject ( ex ) ;
897904 }
898905 } ) ;
899906} ;
900907
908+ firebase . removeEventListener = function ( listener , path ) {
909+ return new Promise ( function ( resolve , reject ) {
910+ try {
911+ console . log ( "Removing listener at path " + path + ": " + listener ) ;
912+ var where = firebase . instance ;
913+ if ( path !== undefined ) {
914+ where = firebase . instance . childByAppendingPath ( path ) ;
915+ }
916+ where . removeObserverWithHandle ( listener ) ;
917+ resolve ( ) ;
918+ } catch ( ex ) {
919+ console . log ( "Error in firebase.removeEventListener: " + ex ) ;
920+ reject ( ex ) ;
921+ }
922+ } ) ;
923+ } ;
924+
925+ firebase . removeEventListeners = function ( listeners , path ) {
926+ return new Promise ( function ( resolve , reject ) {
927+ try {
928+ var where = firebase . instance ;
929+ if ( path !== undefined ) {
930+ where = firebase . instance . childByAppendingPath ( path ) ;
931+ }
932+ for ( var i = 0 ; i < listeners . length ; i ++ ) {
933+ var listener = listeners [ i ] ;
934+ console . log ( "Removing listener at path " + path + ": " + listener ) ;
935+ where . removeObserverWithHandle ( listener ) ;
936+ }
937+ resolve ( ) ;
938+ } catch ( ex ) {
939+ console . log ( "Error in firebase.removeEventListeners: " + ex ) ;
940+ reject ( ex ) ;
941+ }
942+ } ) ;
943+ } ;
944+
901945firebase . push = function ( path , val ) {
902946 return new Promise ( function ( resolve , reject ) {
903947 try {
@@ -1028,8 +1072,10 @@ firebase.query = function (updateCallback, path, options) {
10281072 resolve ( firebase . getCallbackData ( 'ValueChanged' , snapshot ) ) ;
10291073 } ) ;
10301074 } else {
1031- firebase . _addObservers ( query , updateCallback ) ;
1032- resolve ( ) ;
1075+ resolve ( {
1076+ path : path ,
1077+ listeners : firebase . _addObservers ( query , updateCallback )
1078+ } ) ;
10331079 }
10341080 } catch ( ex ) {
10351081 console . log ( "Error in firebase.query: " + ex ) ;
0 commit comments