blob: fdaa879977c97b76089335843e3751390803c742 [file] [log] [blame]
// Copyright 2017, the Flutter project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
part of firebase_database;
/// Represents a query over the data at a particular location.
class Query {
Query._(this._database, this._pathComponents)
: path = _pathComponents.join('/');
final FirebaseDatabase _database;
final List<String> _pathComponents;
/// Slash-delimited path representing the database location of this query.
final String path;
Stream<Event> _observe(_EventType eventType) {
Future<int> _handle;
// TODO(collinjackson): fix close_sinks analyzer warning.
StreamController<Event> controller; // ignore: close_sinks
controller = new StreamController<Event>.broadcast(
onListen: () async {
_handle = _database._channel.invokeMethod(
'Query#observe',
{ 'path': path, 'eventType': eventType.toString() },
);
_handle.then((int handle) {
FirebaseDatabase._observers[handle] = controller;
});
},
onCancel: () async {
int handle = await _handle;
await _database._channel.invokeMethod(
'Query#removeObserver',
{ 'handle': handle },
);
FirebaseDatabase._observers.remove(handle);
},
);
return controller.stream;
}
/// Gets a single value event.
Future<DataSnapshot> once() async => (await onValue.first).snapshot;
/// Fires when children are added.
Stream<Event> get onChildAdded => _observe(_EventType.childAdded);
/// Fires when children are removed. `previousChildKey` is null.
Stream<Event> get onChildRemoved => _observe(_EventType.childRemoved);
/// Fires when children are changed.
Stream<Event> get onChildChanged => _observe(_EventType.childChanged);
/// Fires when children are moved.
Stream<Event> get onChildMoved => _observe(_EventType.childMoved);
/// Fires the data at this location is updated. `previousChildKey` is null.
Stream<Event> get onValue => _observe(_EventType.value);
}