@@ -1395,55 +1395,60 @@ firebase.webQuery = (path: string): QueryBase => {
1395
1395
} ;
1396
1396
1397
1397
class Query implements QueryBase {
1398
- private query : FIRDatabaseQuery ; // Keep track of internal query state allowing us to chain filter/range/limit
1398
+ private query : FIRDatabaseQuery | FIRDatabaseReference ; // Keep track of internal query state allowing us to chain filter/range/limit
1399
1399
private static eventListenerMap : Map < string , Array < any > > = new Map ( ) ; // A map to keep track all all the listeners attached for the specified eventType
1400
1400
1401
- constructor ( private dbRef : FIRDatabaseReference , private path : string ) { }
1401
+ constructor ( private dbRef : FIRDatabaseReference , private path : string ) {
1402
+ this . query = this . dbRef ;
1403
+ }
1402
1404
1403
1405
on ( eventType : string , callback : ( a : any , b ?: string ) => any ) : Promise < any > {
1404
1406
const onValueEvent = result => {
1405
- if ( result . error ) {
1406
- callback ( result ) ; // CAREFUL before we were calling result.error!
1407
- } else {
1408
- callback ( {
1409
- key : result . key ,
1410
- val : ( ) => result . value ,
1411
- exists : ( ) => ! ! result . value
1412
- } ) ;
1413
- }
1407
+ callback ( result ) ;
1414
1408
} ;
1415
1409
return new Promise ( ( resolve , reject ) => {
1416
1410
try {
1417
1411
if ( eventType === "value" || eventType === "child_added" || eventType === "child_changed"
1418
1412
|| eventType === "child_removed" || eventType === "child_moved" ) {
1419
- // This.query may not exist if we call on without any sorts
1420
- const firDatabaseHandle = this . query ? this . attachEventObserver ( this . query , eventType , onValueEvent ) :
1421
- this . attachEventObserver ( this . dbRef , eventType , onValueEvent ) ;
1413
+ const firDataEventType = this . eventToFIRDataEventType ( eventType ) ;
1414
+ const firDatabaseHandle = this . attachEventObserver ( this . query , firDataEventType , onValueEvent ) ;
1422
1415
if ( ! Query . eventListenerMap . has ( eventType ) ) {
1423
1416
Query . eventListenerMap . set ( eventType , [ ] ) ;
1424
1417
}
1425
1418
Query . eventListenerMap . get ( eventType ) . push ( firDatabaseHandle ) ; // We need to keep track of the listeners to fully remove them when calling off
1426
1419
} else {
1420
+ callback ( {
1421
+ error : "Invalid eventType. Use one of the following: 'value', 'child_added', 'child_changed', 'child_removed', or 'child_moved'"
1422
+ } ) ;
1427
1423
reject ( "Invalid eventType. Use one of the following: 'value', 'child_added', 'child_changed', 'child_removed', or 'child_moved'" ) ;
1428
1424
return ;
1429
1425
}
1430
1426
resolve ( ) ;
1431
1427
} catch ( ex ) {
1432
- console . log ( "Error in firebase.addValueEventListener : " + ex ) ;
1428
+ console . log ( "Error in firebase.on : " + ex ) ;
1433
1429
reject ( ex ) ;
1434
1430
}
1435
1431
} ) ;
1436
1432
}
1437
1433
1438
- once ( eventType : string ) : Promise < any > {
1434
+ once ( eventType : string ) : Promise < DataSnapshot > {
1439
1435
return new Promise ( ( resolve , reject ) => {
1440
- firebase . getValue ( this . path ) . then ( result => {
1441
- resolve ( {
1442
- key : result . key ,
1443
- val : ( ) => result . value ,
1444
- exists : ( ) => ! ! result . value
1445
- } ) ;
1446
- } ) ;
1436
+ try {
1437
+ const firDataEventType = this . eventToFIRDataEventType ( eventType ) ;
1438
+ this . query . observeEventTypeWithBlockWithCancelBlock (
1439
+ firDataEventType ,
1440
+ snapshot => {
1441
+ resolve ( nativeSnapshotToWebSnapshot ( snapshot ) ) ;
1442
+ } ,
1443
+ firebaseError => {
1444
+ reject ( {
1445
+ error : firebaseError . localizedDescription
1446
+ } ) ;
1447
+ } ) ;
1448
+ } catch ( ex ) {
1449
+ console . log ( "Error in firebase.once: " + ex ) ;
1450
+ reject ( ex ) ;
1451
+ }
1447
1452
} ) ;
1448
1453
}
1449
1454
@@ -1461,34 +1466,22 @@ class Query implements QueryBase {
1461
1466
}
1462
1467
1463
1468
orderByChild ( value : string ) : Query {
1464
- if ( this . query ) {
1465
- throw new Error ( "You can't combine multiple orderBy calls!" ) ;
1466
- }
1467
- this . query = this . dbRef . queryOrderedByChild ( value ) ;
1469
+ this . query = this . query . queryOrderedByChild ( value ) ;
1468
1470
return this ;
1469
1471
}
1470
1472
1471
1473
orderByKey ( ) : Query {
1472
- if ( this . query ) {
1473
- throw new Error ( "You can't combine multiple orderBy calls!" ) ;
1474
- }
1475
- this . query = this . dbRef . queryOrderedByKey ( ) ;
1474
+ this . query = this . query . queryOrderedByKey ( ) ;
1476
1475
return this ;
1477
1476
}
1478
1477
1479
1478
orderByPriority ( ) : Query {
1480
- if ( this . query ) {
1481
- throw new Error ( "You can't combine multiple orderBy calls!" ) ;
1482
- }
1483
- this . query = this . dbRef . queryOrderedByPriority ( ) ;
1479
+ this . query = this . query . queryOrderedByPriority ( ) ;
1484
1480
return this ;
1485
1481
}
1486
1482
1487
1483
orderByValue ( ) : Query {
1488
- if ( this . query ) {
1489
- throw new Error ( "You can't combine multiple orderBy calls!" ) ;
1490
- }
1491
- this . query = this . dbRef . queryOrderedByValue ( ) ;
1484
+ this . query = this . query . queryOrderedByValue ( ) ;
1492
1485
return this ;
1493
1486
}
1494
1487
@@ -1532,12 +1525,7 @@ class Query implements QueryBase {
1532
1525
return this ;
1533
1526
}
1534
1527
1535
- /**
1536
- * Depending on the eventType, attach listeners at the specified Database location. Follow the WebApi which listens
1537
- * to specific events (Android is more generic value / child - which includes all events add, change, remove etc).
1538
- * Similar to firebase._addObserver but I do not want to listen for every event
1539
- */
1540
- private attachEventObserver ( dbRef : FIRDatabaseQuery | FIRDatabaseReference , eventType : string , callback ) : number {
1528
+ private eventToFIRDataEventType ( eventType : string ) : FIRDataEventType {
1541
1529
let firEventType : FIRDataEventType ;
1542
1530
switch ( eventType ) {
1543
1531
case "value" :
@@ -1556,11 +1544,18 @@ class Query implements QueryBase {
1556
1544
firEventType = FIRDataEventType . ChildMoved ;
1557
1545
break ;
1558
1546
}
1559
-
1547
+ return firEventType ;
1548
+ }
1549
+ /**
1550
+ * Depending on the eventType, attach listeners at the specified Database location. Follow the WebApi which listens
1551
+ * to specific events (Android is more generic value / child - which includes all events add, change, remove etc).
1552
+ * Similar to firebase._addObserver but I do not want to listen for every event
1553
+ */
1554
+ private attachEventObserver ( dbRef : FIRDatabaseQuery | FIRDatabaseReference , firEventType : FIRDataEventType , callback ) : number {
1560
1555
const listener = dbRef . observeEventTypeWithBlockWithCancelBlock (
1561
1556
firEventType ,
1562
1557
snapshot => {
1563
- callback ( firebase . getCallbackData ( eventType , snapshot ) ) ;
1558
+ callback ( nativeSnapshotToWebSnapshot ( snapshot ) ) ;
1564
1559
} ,
1565
1560
firebaseError => {
1566
1561
callback ( {
0 commit comments