Skip to content

Commit 06ac7cf

Browse files
committed
Add error callback for database .on handler (matches Web spec)
1 parent 6a5c878 commit 06ac7cf

File tree

4 files changed

+31
-15
lines changed

4 files changed

+31
-15
lines changed

android/src/main/java/io/fullstack/firestack/database/FirestackDatabaseReference.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public void onChildMoved(DataSnapshot dataSnapshot, String previousChildName) {
6868

6969
@Override
7070
public void onCancelled(DatabaseError error) {
71-
handleDatabaseError(eventName, error);
71+
handleDatabaseError(error);
7272
}
7373
};
7474
mQuery.addChildEventListener(mEventListener);
@@ -90,7 +90,7 @@ public void onDataChange(DataSnapshot dataSnapshot) {
9090

9191
@Override
9292
public void onCancelled(DatabaseError error) {
93-
handleDatabaseError("value", error);
93+
handleDatabaseError(error);
9494
}
9595
};
9696
mQuery.addValueEventListener(mValueListener);
@@ -162,22 +162,22 @@ private void handleDatabaseEvent(final String name, final DataSnapshot dataSnaps
162162
WritableMap data = Utils.dataSnapshotToMap(name, mPath, mModifiersString, dataSnapshot);
163163
WritableMap evt = Arguments.createMap();
164164
evt.putString("eventName", name);
165-
evt.putString("path", mPath);
166-
evt.putString("modifiersString", mModifiersString);
167165
evt.putMap("body", data);
168166

169167
Utils.sendEvent(mReactContext, "database_event", evt);
170168
}
171169

172-
private void handleDatabaseError(final String name, final DatabaseError error) {
170+
private void handleDatabaseError(final DatabaseError error) {
173171
WritableMap err = Arguments.createMap();
172+
err.putString("eventName", "database_error");
173+
err.putString("path", mPath);
174+
err.putString("modifiersString", mModifiersString);
174175
err.putInt("errorCode", error.getCode());
175176
err.putString("errorDetails", error.getDetails());
176-
err.putString("description", error.getMessage());
177+
err.putString("msg", error.getMessage());
177178

178179
WritableMap evt = Arguments.createMap();
179-
evt.putString("eventName", name);
180-
evt.putString("path", mPath);
180+
evt.putString("eventName", "database_error");
181181
evt.putMap("body", err);
182182

183183
Utils.sendEvent(mReactContext, "database_error", evt);

ios/Firestack/FirestackDatabase.m

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,9 @@ - (void) addEventHandler:(NSString *) eventName
5858
};
5959
id errorBlock = ^(NSError * _Nonnull error) {
6060
NSLog(@"Error onDBEvent: %@", [error debugDescription]);
61-
[self getAndSendDatabaseError:error withPath: _path];
61+
[self getAndSendDatabaseError:error
62+
path:_path
63+
modifiersString:_modifiersString];
6264
};
6365
int eventType = [self eventTypeFromName:eventName];
6466
FIRDatabaseHandle handle = [_query observeEventType:eventType
@@ -158,11 +160,13 @@ - (NSDictionary *) snapshotToDict:(FIRDataSnapshot *) snapshot
158160
}
159161

160162
- (NSDictionary *) getAndSendDatabaseError:(NSError *) error
161-
withPath:(NSString *) path
163+
path:(NSString *) path
164+
modifiersString:(NSString *) modifiersString
162165
{
163166
NSDictionary *evt = @{
164167
@"eventName": DATABASE_ERROR_EVENT,
165168
@"path": path,
169+
@"modifiersString": modifiersString,
166170
@"msg": [error debugDescription]
167171
};
168172
[self sendJSEvent:DATABASE_ERROR_EVENT title:DATABASE_ERROR_EVENT props: evt];

lib/modules/database/index.js

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ export default class Database extends Base {
1919
constructor(firestack: Object, options: Object = {}) {
2020
super(firestack, options);
2121
this.subscriptions = {};
22+
this.errorSubscriptions = {};
2223
this.serverTimeOffset = 0;
2324
this.persistenceEnabled = false;
2425
this.namespace = 'firestack:database';
@@ -86,13 +87,17 @@ export default class Database extends Base {
8687
* @param cb
8788
* @returns {*}
8889
*/
89-
on(path: string, modifiersString: string, modifiers: Array<string>, eventName: string, cb: () => void) {
90+
on(path: string, modifiersString: string, modifiers: Array<string>, eventName: string, cb: () => void, errorCb: () => void) {
9091
const handle = this._handle(path, modifiersString);
9192
this.log.debug('adding on listener', handle);
9293

9394
if (!this.subscriptions[handle]) this.subscriptions[handle] = {};
9495
if (!this.subscriptions[handle][eventName]) this.subscriptions[handle][eventName] = [];
9596
this.subscriptions[handle][eventName].push(cb);
97+
if (errorCb) {
98+
if (!this.errorSubscriptions[handle]) this.errorSubscriptions[handle] = [];
99+
this.errorSubscriptions[handle].push(errorCb);
100+
}
96101

97102
return promisify('on', FirestackDatabase)(path, modifiersString, modifiers, eventName);
98103
}
@@ -129,7 +134,7 @@ export default class Database extends Base {
129134
} else {
130135
this.subscriptions[handle] = {};
131136
}
132-
137+
this.errorSubscriptions[handle] = [];
133138
return promisify('off', FirestackDatabase)(path, modifiersString, eventName);
134139
}
135140

@@ -207,6 +212,12 @@ export default class Database extends Base {
207212
* @private
208213
*/
209214
_handleDatabaseError(err: Object) {
210-
this.log.debug('_handleDatabaseError ->', err);
215+
const body = err.body || {};
216+
const { path, modifiersString, eventName, msg } = body;
217+
const handle = this._handle(path, modifiersString);
218+
219+
this.log.debug('_handleDatabaseError ->', handle, eventName, err);
220+
221+
if (this.errorSubscriptions[handle]) this.errorSubscriptions[handle].forEach((cb) => cb(new Error(msg)));
211222
}
212223
}

lib/modules/database/reference.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,13 +94,14 @@ export default class Reference extends ReferenceBase {
9494
});
9595
}
9696

97-
on(eventName: string, cb: () => any) {
97+
on(eventName: string, cb: () => any, errorCb: () => any) {
9898
if (!isFunction(cb)) throw new Error('The specified callback must be a function');
99+
if (errorCb && !isFunction(errorCb)) throw new Error('The specified error callback must be a function');
99100
const path = this._dbPath();
100101
const modifiers = this.query.getModifiers();
101102
const modifiersString = this.query.getModifiersString();
102103
this.log.debug('adding reference.on', path, modifiersString, eventName);
103-
return this.db.on(path, modifiersString, modifiers, eventName, cb);
104+
return this.db.on(path, modifiersString, modifiers, eventName, cb, errorCb);
104105
}
105106

106107
once(eventName: string = 'once', cb: (snapshot: Object) => void) {

0 commit comments

Comments
 (0)