Skip to content

Commit 63fcf4b

Browse files
authored
Merge pull request #260 from Salakar/master
Add error callback for database .on handler (matches Web spec)
2 parents 999bf02 + 06ac7cf commit 63fcf4b

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

+8-8
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

+6-2
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,9 @@ - (void) addEventHandler:(NSString *) eventName
6565
};
6666
id errorBlock = ^(NSError * _Nonnull error) {
6767
NSLog(@"Error onDBEvent: %@", [error debugDescription]);
68-
[self getAndSendDatabaseError:error withPath: _path];
68+
[self getAndSendDatabaseError:error
69+
path:_path
70+
modifiersString:_modifiersString];
6971
};
7072
int eventType = [self eventTypeFromName:eventName];
7173
FIRDatabaseHandle handle = [_query observeEventType:eventType
@@ -167,11 +169,13 @@ - (NSDictionary *) snapshotToDict:(FIRDataSnapshot *) snapshot
167169
}
168170

169171
- (NSDictionary *) getAndSendDatabaseError:(NSError *) error
170-
withPath:(NSString *) path
172+
path:(NSString *) path
173+
modifiersString:(NSString *) modifiersString
171174
{
172175
NSDictionary *evt = @{
173176
@"eventName": DATABASE_ERROR_EVENT,
174177
@"path": path,
178+
@"modifiersString": modifiersString,
175179
@"msg": [error debugDescription]
176180
};
177181
[self sendJSEvent:DATABASE_ERROR_EVENT title:DATABASE_ERROR_EVENT props: evt];

lib/modules/database/index.js

+14-3
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

+3-2
Original file line numberDiff line numberDiff line change
@@ -106,13 +106,14 @@ export default class Reference extends ReferenceBase {
106106
});
107107
}
108108

109-
on(eventName: string, cb: () => any) {
109+
on(eventName: string, cb: () => any, errorCb: () => any) {
110110
if (!isFunction(cb)) throw new Error('The specified callback must be a function');
111+
if (errorCb && !isFunction(errorCb)) throw new Error('The specified error callback must be a function');
111112
const path = this._dbPath();
112113
const modifiers = this.query.getModifiers();
113114
const modifiersString = this.query.getModifiersString();
114115
this.log.debug('adding reference.on', path, modifiersString, eventName);
115-
return this.db.on(path, modifiersString, modifiers, eventName, cb);
116+
return this.db.on(path, modifiersString, modifiers, eventName, cb, errorCb);
116117
}
117118

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

0 commit comments

Comments
 (0)