@bigin/ns-firebase
Version:
185 lines (184 loc) • 4.85 kB
JavaScript
import { firebase } from '../../firebase';
import { nextPushId } from './util/NextPushId';
export var database;
(function (database) {
class Query {
constructor(path) {
this.path = path;
}
on(eventType, callback, cancelCallbackOrContext, context) {
const onValueEvent = (result) => {
if (result.error) {
callback(result);
} else {
callback({
key: result.key,
val: () => result.value,
exists: () => !!result.value,
});
}
};
firebase.addValueEventListener(onValueEvent, this.path).then(
(result) => {
if (!Query.registeredListeners.has(this.path)) {
Query.registeredListeners.set(this.path, []);
}
Query.registeredListeners.set(this.path, Query.registeredListeners.get(this.path).concat(result.listeners));
},
(error) => {
console.log('firebase.database().on error: ' + error);
}
);
if (!Query.registeredCallbacks.has(this.path)) {
Query.registeredCallbacks.set(this.path, []);
}
Query.registeredCallbacks.get(this.path).push(callback);
return null;
}
off(eventType, callback, context) {
if (Query.registeredListeners.has(this.path)) {
firebase.removeEventListeners(Query.registeredListeners.get(this.path), this.path).then(
(result) => Query.registeredListeners.delete(this.path),
(error) => console.log('firebase.database().off error: ' + error)
);
}
Query.registeredCallbacks.delete(this.path);
return null;
}
once(eventType, successCallback, failureCallbackOrContext, context) {
return new Promise((resolve, reject) => {
firebase.getValue(this.path).then((result) => {
resolve({
key: result.key,
val: () => result.value,
exists: () => !!result.value,
});
});
});
}
getOnValueEventHandler() {
return (result) => {
const callbacks = Query.registeredCallbacks.get(this.path);
callbacks &&
callbacks.map((callback) => {
callback({
key: result.key,
val: () => result.value,
exists: () => !!result.value,
});
});
};
}
orderByChild(child) {
firebase.query(this.getOnValueEventHandler(), this.path, {
orderBy: {
type: firebase.QueryOrderByType.CHILD,
value: child,
},
});
return this;
}
orderByKey() {
firebase.query(this.getOnValueEventHandler(), this.path, {
orderBy: {
type: firebase.QueryOrderByType.KEY,
},
});
return this;
}
orderByPriority() {
firebase.query(this.getOnValueEventHandler(), this.path, {
orderBy: {
type: firebase.QueryOrderByType.PRIORITY,
},
});
return this;
}
orderByValue() {
firebase.query(this.getOnValueEventHandler(), this.path, {
orderBy: {
type: firebase.QueryOrderByType.VALUE,
},
});
return this;
}
}
Query.registeredListeners = new Map();
Query.registeredCallbacks = new Map();
database.Query = Query;
class Reference extends Query {
getKey() {
if (!this.path) {
return null;
} else {
return this.path.lastIndexOf('/') === -1 ? this.path : this.path.substring(this.path.lastIndexOf('/') + 1);
}
}
get key() {
return this.getKey();
}
set(value, onComplete) {
return new Promise((resolve, reject) => {
firebase
.setValue(this.path, value)
.then(() => {
onComplete && onComplete(null);
resolve(null);
})
.catch((err) => {
onComplete && onComplete(err);
reject(err);
});
});
}
child(path) {
return new Reference(this.path ? `${this.path}/${path}` : path);
}
push(value, onComplete) {
const now = new Date().getTime();
const name = nextPushId(now);
const thennablePushRef = this.child(name);
const pushRef = this.child(name);
let promise;
if (value != null) {
promise = thennablePushRef.set(value, onComplete).then(() => pushRef);
} else {
promise = Promise.resolve(pushRef);
}
thennablePushRef.then = promise.then.bind(promise);
thennablePushRef.catch = promise.then.bind(promise, undefined);
if (typeof onComplete === 'function') {
promise.catch(() => {});
}
return thennablePushRef;
}
remove(onComplete) {
return new Promise((resolve, reject) => {
firebase
.remove(this.path)
.then(() => {
onComplete && onComplete(null);
resolve(null);
})
.catch((err) => {
onComplete && onComplete(err);
reject(err);
});
});
}
onDisconnect() {
return firebase.onDisconnect(this.path);
}
transaction(transactionUpdate, onComplete, applyLocally) {
return firebase.transaction(this.path, transactionUpdate, onComplete);
}
}
database.Reference = Reference;
class Database {
ref(path) {
return new Reference(path);
}
}
database.Database = Database;
})(database || (database = {}));
//# sourceMappingURL=index.js.map